Согласно документации по aio_read / write, библиотека AIO может сообщить вашему приложению 2 способа, что операция ввода-вывода асинхронного файла завершена. Либо 1) вы можете использовать сигнал, 2) вы можете использовать функцию обратного вызова
Я думаю, что функции обратного вызова значительно предпочтительнее сигналов, и, вероятно, их будет намного проще интегрировать в многопоточные библиотеки более высокого уровня. К сожалению, документация для этой функциональности - беспорядок, если не сказать больше. Некоторые источники, такие как справочная страница для структуры sigevent , указывают на то, что необходимо установить для элемента данных sigev_notify в структуре sigevent значение SIGEV_CALLBACK и затем предоставить обработчик функции. Предположительно, обработчик вызывается в том же потоке. Другая документация указывает, что вам нужно установить sigev_notify в SIGEV_THREAD, что вызовет обработчик обратного вызова во вновь созданном потоке.
В любом случае, в моей системе Linux (Ubuntu с ядром 2.6.28) SIGEV_CALLBACK, похоже, нигде не определен, но SIGEV_THREAD работает так, как объявлено. К сожалению, создание нового потока для вызова обработчика обратного вызова кажется действительно неэффективным, особенно если вам нужно вызывать много обработчиков. Было бы лучше использовать существующий пул потоков, аналогично тому, как работает большинство демультиплексоров событий сетевого ввода-вывода. В некоторых версиях UNIX, таких как QNX, есть флаг SIGEV_SIGNAL_THREAD, который позволяет вам вызывать обработчики, используя указанный существующий поток, но, похоже, он недоступен в Linux и даже не является частью POSIX. стандарт.
Итак, возможно ли использовать библиотеку POSIX AIO для вызова пользовательских обработчиков в заранее выделенном фоновом потоке / пуле потоков вместо создания / уничтожения нового потока при каждом вызове обработчика?