Здесь показана стандартная техника использования
pthread_join
, вызывающая при первом знакомстве вопрос: «А что произойдет, если потоки завершатся в другом порядке, а не в той последовательности, в которой они запускались?» (порядок слежения во 2-м цикле). Но в том-то и состоит приятная особенность этой техники, что ничего не произойдет, — второй цикл является точкой синхронизации
всехпотоков
THR_NUM
, независимо от взаимного порядка их завершения.
Дисциплина диспетчеризации
Для дочернего потока может потребоваться установить иную по отношению к родителю дисциплину (политику) диспетчеризации (
SCHED_FIFO
,
SCHED_RR
,
SCHED_SPORADIC
):
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED);
pthread_attr_setschedpolicy(&attr, SCHED_RR);
Особенностью здесь является то, что после инициализации атрибутной записи значениями по умолчанию в параметре типа наследования атрибутной записи будет стоять
PTHREAD_EXPLICIT_SCHED
(«наследовать от родителя»). Изменение параметров, таких как политика диспетчеризации, приоритет и др., будет иметь силу, только если мы посредством вызова
pthread_attr_setinheritsched
принудительно переустановим значение типа наследования в
PTHREAD_EXPLICIT_SCHED
.
Приоритет
Пожалуй, наиболее часто приходится переопределять именно приоритет, с которым будет выполняться создаваемый поток. При запуске потока с параметрами по умолчанию его приоритет устанавливается равным приоритету порождающего потока.