проверьте, закончил ли aio_write - PullRequest
2 голосов
/ 13 июня 2011

Есть ли способ проверить, нет ли записи AIO в данный файл?Я делаю проект на моем курсе Unix, который будет не зависящим от контекста (основанным на UDP) шахматным сервером, и все данные должны храниться в файлах.Приложение будет однопоточным и однопоточным (ожидаемо для функций AIO).Моя проблема в том, что:

1) Player One отправляет некоторые данные, которые запускают операцию aio_write, в файлы, и процесс идет2) Player Two запрашивает текущее состояние доски, которое должно быть прочитано из этого файла, но если предыдущий aio_write еще не завершен, тогда этот файл не является окончательным, и поэтому я не должен читать, но дождаться окончания aio_writeПроблема в том, что, поскольку это не зависит от контекста, у меня нет структуры aiocb из вызова aio_write.

Также могут быть aio_writes из других игр (использующих различные файлы), о которых мне не нужно заботиться, только если в данный момент идет запись определенного файла.

Ответы [ 2 ]

2 голосов
/ 13 июня 2011

Почему вы используете AIO для этого? Целью AIO не является синхронизация между процессами. Это просто для того, чтобы ваш процесс не спал в пространстве ядра, когда чтение или запись не могут быть немедленно выполнены из-за загрузки диска (чтение) или давления кэша (запись). На таких небольших транзакциях, с которыми будут работать шахматы, AIO должен вести себя точно так же, как обычно read и write IO: все операции будут завершены немедленно, хотя и с умеренными накладными расходами.

Если ваша цель - синхронизировать доступ к файлу, вы, возможно, можете использовать fcntl блокировку или mmap ваши файлы и включить мьютекс или семафор где-нибудь в файле.

1 голос
/ 13 июня 2011

Тот факт, что он не зависит от контекста, не должен помешать вам хранить некоторую информацию о состоянии.

Вы можете сохранить контекст (я имею в виду io_context) и просто использовать его повторно (отправить запрос на чтение и дождаться его - io_getevents). io_submit говорит, что отправляет запросы в очередь, поэтому я считаю, что это сохранит порядок операций.

В качестве альтернативы (если вы обнаружите, что io_submit не сохраняет порядок), вы можете сохранить достаточно состояния, чтобы знать, что операция записи ожидает, и ждать, используя io_getevents. Тогда чтение будет безопасным.

Надеюсь, я не понял ваш вопрос.

EDIT

Кажется, я сделал неправильно прочитал ваш вопрос . Вы, вероятно, говорите о POSIX aio(7). Я говорил об истинном асинхронном вводе / выводе (libaio.h). POSIX aio обычно реализуется с использованием потоков (какой тип отстой).

В любом случае, если вы можете ждать событий (что, я думаю, вы можете), вы все равно можете сделать это: оставить какое-то состояние для объявления записи ожидающим, а когда кто-то хочет прочитать, дождитесь завершения записи. *

...