Могу ли я предотвратить выход pthread из пользовательского пространства Linux в критическом коде?

StackOverflow https://stackoverflow.com/questions/2865047

Вопрос

Я работаю над приложением пользовательского пространства для встроенного проекта Linux, использующего ядро 2.6.24.3.Мое приложение передает данные между двумя файловыми узлами, создавая 2 pthreads, каждый из которых находится в режиме ожидания до завершения асинхронной операции ввода-вывода, после чего оно просыпается и запускает обработчик завершения.

Обработчики завершения должны отслеживать, сколько переводов находится на рассмотрении, и поддерживать несколько связанных списков, в которые один поток добавит, а другой удалит.

// 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 при удержании блокировки мьютекса / вращения?

Это было полезно?

Решение

Вы можете использовать sched_setscheduler() системный вызов для временной установки политики планирования потока на SCHED_FIFO, затем снова установите его на место.Из самого sched_setscheduler() справочная страница:

A SCHED_FIFO процесс выполняется до тех пор, пока либо он не будет заблокирован запросом ввода-вывода, либо он не будет вытеснен процессом с более высоким приоритетом , либо он не вызовет sched_yield(2).

(В данном контексте "процесс" на самом деле означает "поток").

Однако это довольно подозрительное требование.Какую проблему вы надеетесь решить?Если вы просто пытаетесь защитить свой связанный список обработчиков завершения от одновременного доступа, то вам подойдет обычный мьютекс.Попросите поток завершения заблокировать мьютекс, удалите элемент списка, разблокируйте мьютекс, затем вызовите обработчик завершения.

Другие советы

Я думаю, вы захотите использовать мьютексы / блокировки, чтобы предотвратить условия гонки здесь.Мьютексы ни в коем случае не являются магией вуду и могут даже упростить ваш код по сравнению с использованием произвольных системных функций, которые вам потенциально понадобятся для переноса между системами.Однако не знаю, является ли последнее проблемой для вас.

Я полагаю, что здесь вы пытаетесь перехитрить планировщик Linux по неправильным причинам.

Правильное решение - использовать мьютекс, чтобы предотвратить параллельный запуск обработчиков завершения.Позвольте планировщику выполнять свою работу.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top