Я работаю над приложением пользовательского пространства для встроенного проекта Linux, использующего ядро 2.6.24.3.
Мое приложение передает данные между двумя файловыми узлами, создавая 2 pthread, каждый из которых находится в спящем режиме, до тех пор, пока не завершится асинхронная операция ввода-вывода, после чего оно запускается и запускает обработчик завершения.
Обработчики завершения должны отслеживать количество ожидающих передач и поддерживать несколько связанных списков, которые один поток добавит, а другой удалит.
// sleep here until events arrive or time out expires
for(;;) {
no_of_events = io_getevents(ctx, 1, num_events, events, &timeout);
// Process each aio event that has completed or thrown an error
for (i=0; i<no_of_events; i++) {
// Get pointer to completion handler
io_complete = (io_callback_t) events[i].data;
// Get pointer to data object
iocb = (struct iocb *) events[i].obj;
// Call completion handler and pass it the data object
io_complete(ctx, iocb, events[i].res, events[i].res2);
}
}
Мой вопрос такой ...
Есть ли простой способ предотвратить выход текущего активного потока, пока он запускает обработчик завершения, а не идет по маршруту блокировки мьютекса / вращения?
Или не удается настроить Linux для предотвращения выдачи pthread при удержании блокировки мьютекса / вращения?