Проверьте, закончил ли 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 обычно реализуется с использованием потоков (какой тип отстой).

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

Другие вопросы по тегам