Может быть, вам нужно возиться с маской сигналов или, может быть, сигналы не могут выйти из спящего ... Я не знаю. Я не знаю, что может использовать sigwait () или sigtimedwait (). Мы используем pthread_kill, чтобы пробуждать потоки, но мы спим их, используя sigwait .... не usleep. Это самый быстрый способ, который я нашел, чтобы сделать это (в 40-50 раз быстрее, чем ожидание в pthread_cond согласно моим тестам.)
Мы делаем это перед созданием темы:
int fSigSet;
sigemptyset(&fSigSet);
sigaddset(&fSigSet, SIGUSR1);
sigaddset(&fSigSet, SIGSEGV);
pthread_sigmask(SIG_BLOCK, &fSigSet, NULL);
Каждая созданная нить наследует эту маску. Я немного путаюсь с масками. Вы либо говорите системе ничего не делать для определенных сигналов, либо, возможно, вы говорите системе, что обрабатываете некоторые сигналы ... Я не знаю. Кто-то другой может помочь нам. Если бы я лучше узнал, как работают маски, я мог бы сказать вам, что вы можете просто вставить приведенный выше код в ваш ThreadProc. Кроме того, я не уверен, нужен ли SIGSEGV.
Затем поток вызывает это, чтобы заснуть сам:
int fSigReceived;
// next line sleeps the thread
sigwait(&fSigSet, &fSigReceived); // assuming you saved fSigSet from above...
// you get here when the thread is woken up by the signal
// you can check fSigReceived if you care what signal you got.
Затем вы делаете это, чтобы пробудить нить:
thread_kill(pThread, SIGUSR1);