Проверьте, закончил ли aio_write
Есть ли способ проверить, нет ли записи AIO в данный файл? Я делаю проект на моем курсе Unix, который будет не зависящим от контекста (основанным на UDP) шахматным сервером, и все данные должны храниться в файлах. Приложение будет однопоточным и однопоточным (ожидаемо для функций AIO). Моя проблема в том, что:
1) Player One отправляет некоторые данные, которые запускают операцию aio_write в файлы, и процесс идет
2) Второй игрок запрашивает текущее состояние доски, которое должно быть прочитано из этого файла, но если предыдущий aio_write еще не завершен, тогда этот файл не является окончательным, и поэтому я не должен читать пока, но дождусь окончания aio_write.
Проблема в том, что, поскольку это не зависит от контекста, у меня нет структуры aiocb из вызова aio_write.
Также могут быть aio_writes из других игр (которые используют разные файлы), о которых мне не нужно заботиться, только если конкретный файл в данный момент находится на записи.
2 ответа
Почему вы используете AIO для этого? Целью AIO не является синхронизация между процессами. Это просто для того, чтобы ваш процесс не спал в пространстве ядра, когда чтение или запись не могут быть немедленно выполнены из-за загрузки диска (чтение) или нагрузки на кэш (запись). На таких небольших транзакциях, с которыми будут работать шахматы, AIO должен вести себя точно так же, как обычно read
а также write
IO: все операции будут завершены немедленно, хотя и с умеренно большими накладными расходами.
Если ваша цель - синхронизировать доступ к файлам, вы можете использовать fcntl
блокировка, или mmap
ваши файлы и включить мьютекс или семафор где-нибудь в файле.
Тот факт, что он не зависит от контекста, не должен помешать вам хранить некоторую информацию о состоянии.
Вы могли бы сохранить контекст (я имею в виду io_context
) и просто используйте его повторно (отправьте запрос на чтение и дождитесь его - io_getevents
). io_submit
говорит, что он помещает запросы в очередь, поэтому я верю, что это сохранит порядок операций.
В качестве альтернативы, (если вы узнаете, что io_submit
не сохраняет порядок) вы можете сохранить достаточно состояния, чтобы знать, что операция записи ожидает, и ждать, используя io_getevents
, Тогда чтение будет безопасным.
Надеюсь, я не понял ваш вопрос.
РЕДАКТИРОВАТЬ
Кажется, я неправильно понял ваш вопрос. Вы, вероятно, говорите о POSIX aio(7)
, Я говорил об истинном асинхронном вводе / выводе (libaio.h
). POSIX aio обычно реализуется с использованием потоков (какой тип отстой).
В любом случае, если вы можете ждать событий (что, я думаю, вы можете), вы все равно можете сделать это: удерживать какое-то состояние для объявления записи в ожидании, а когда кто-то хочет прочитать, дождитесь завершения записи.