我正在尝试编写应用程序中的暂停/取消暂停所有线程,这是由SIGUSR1 (暂停)和SIGUSR2 (取消暂停)激活的。我想在所有线程中使用pthread_cond_wait(),当接收到信号时,根据条件使用pthread_cond_broadcast(),我会挂起所有线程,但是显然在信号处理程序中使用pthread_cond_broadcast()是不安全的。这个问题有什么替代的解决办法(我必须避免等待)?
发布于 2015-12-21 11:17:13
您可以使用专用线程对等待信号使用西格等待。当接收到信号时,等待将被返回,并且给定的线程可以通知正常代码中的其他线程(而不是信号处理程序)。
假设您有暂停和取消暂停线程的函数,如下所示
int paused;
pthread_mutex m;
pthread_cond cond;
void pause_threads(void)
{
pthread_mutex_lock(&m);
paused = 1;
pthread_mutex_unlock(&m);
}
void unpause_threads(void)
{
pthread_mutex_lock(&m);
paused = 0;
pthread_cond_broadcast(&cond);
pthread_mutex_unlock(&m);
}专用线程可以以这种方式实现:
// Block signals for wait
sigset_t usr_set;
sigemptyset(&usr_set);
sigaddset(&usr_set, SIGUSR1);
sigaddset(&usr_set, SIGUSR2);
pthread_sigmask(SIG_BLOCK, &usr_set, NULL);
// If other threads will be created from given one, they will share signal handling.
// Otherwise actions above should be repeated for new threads.
int sig;
// Repeatedly wait for signals arriving.
while(!sigwait(&usr_set, &sig)) {
if(sig == SIGUSR1) {
pause_threads();
}
else {
unpause_threads();
}
}https://stackoverflow.com/questions/34386514
复制相似问题