Я могу предотвратить пространство пользователя Linux pthread уступающий в критическом коде?

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

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

// 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, когда взаимное исключение/спин-блокировка сохранено?

5
задан KermitG 19 May 2010 в 11:32
поделиться

3 ответа

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

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

(В этом контексте «процесс» фактически означает «поток»).

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

4
ответ дан 14 December 2019 в 13:28
поделиться

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

1
ответ дан 14 December 2019 в 13:28
поделиться

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

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

1
ответ дан 14 December 2019 в 13:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: