我正在尝试编写应用程序中的暂停/取消暂停所有线程,这是由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();
}
}发布于 2015-12-20 22:41:31
你试过这样的方法吗?
pthread_mutex_lock(&m_suspend_mutex);
while (m_suspend_flag == 1)
{
pthread_cond_wait(&m_resume_cond, &m_suspend_mutex);
}
pthread_mutex_unlock(&m_suspend_mutex);这将暂停线程,直到另一个线程将m_suspend_flag设置为0。这可以放在线程执行周期中的策略位置。对于您的场景,您可以在线程之后放置这段代码,检查消息队列中是否有任何消息。
https://stackoverflow.com/questions/34386514
复制相似问题