Способ сделать это - использовать sigwait () и pthread_kill.
// глобальная переменная
int _fSigSet;
Перед вызовом pthread_create мы устанавливаем маску сигнала.Каждый поток унаследует маску.Вы можете установить маску в функции потока, я полагаю.Вот код, который мы используем:
sigemptyset(&_fSigSet);
sigaddset(&_fSigSet, SIGUSR1);
sigaddset(&_fSigSet, SIGSEGV);
pthread_sigmask(SIG_BLOCK, &_fSigSet, NULL);
...
pthread_create(&Thread, NULL, ThreadProc, NULL);
...
ДЛЯ ОТПРАВЛЕНИЯ:
int nSig; // signal you get if you care.
sigwait(&_fSigSet, &nSig); // thread is suspended here waiting for signal.
ДЛЯ РЕЗЮМЕ:
pthread_kill(&Thread, SIGUSR1);
Если по какой-то причине вы не можете использовать SIGUSR1, имейте в виду, что не все сигналы работают для нас.Возможно, мы что-то делаем не так, но SIGCONT не работает.
Мы таким образом тестировали приостановку потоков, и этот метод был в 5 раз быстрее, чем использование мьютексов и условных переменных.
Вот некоторый код , использующий эту технику.