2013-09-30 3 views
1

Я нашел еще один способ синхронизации потока из исходного кода сильного экрана. Он синхронизирует поток, изменяя политику расписания потока (SCHED_FIFO). Имеет ли он преимущество перед способом mutex?Синхронизация потока с изменением приоритета расписания

The code:

int oldpolicy; 
struct sched_param oldparams, params; 
pthread_getschedparam(thread_id, &oldpolicy, &oldparams); 
params.__sched_priority = sched_get_priority_max(SCHED_FIFO); 
pthread_setschedparam(thread_id, SCHED_FIFO, &params); 

... 
critical section 
... 

pthread_setschedparam(thread_id, oldpolicy, &oldparams); 

PS: strongswan использование таНос крюк для обнаружения утечек памяти. Чтобы поддерживать многопоточность, он использует этот способ для синхронизации потоков.

PPS: Кажется, что они изменили код. Этот фрагмент кода из версии Strongswan 4.5.0.

+0

Нет. Это необычный способ и может повлиять на всю систему. – Chen

+1

Просто не делай этого. –

+0

Непонятно, что вы подразумеваете под «синхронизирующей нитью». –

ответ

4

Это ничего не синхронизирует!

Это предотвращает запланированное выполнение потока от процессора во время работы критической секции. Поскольку теперь у нас есть несколько процессоров, и поскольку другой поток может работать на другом CPU, он вообще ничего не исключает. И это даже не полностью предотвращает упреждение; нить все еще может спать, если ожидает сбоя страницы или другого ввода-вывода.

Причина заключается в том, чтобы избежать голодания других потоков, когда вычисляется что-то очень важное, без которого другие нити не могут продолжаться. Это действительно помогает, но это очень специализированный случай (поиск «приоритетной инверсии»).

+0

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

+0

От всего сердца согласен. –

3

Это сломано, если у вас есть более одного ядра, если только вы не заблокируете все потоки, которые могут конфликтовать с одним и тем же ядром. И даже тогда он все еще сломан, если вы блокируете ввод-вывод. (Например, ошибка страницы.) Yuck.

Смежные вопросы