首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >线程-暂停/取消暂停所有线程

线程-暂停/取消暂停所有线程
EN

Stack Overflow用户
提问于 2015-12-20 22:22:58
回答 2查看 2K关注 0票数 2

我正在尝试编写应用程序中的暂停/取消暂停所有线程,这是由SIGUSR1 (暂停)和SIGUSR2 (取消暂停)激活的。我想在所有线程中使用pthread_cond_wait(),当接收到信号时,根据条件使用pthread_cond_broadcast(),我会挂起所有线程,但是显然在信号处理程序中使用pthread_cond_broadcast()是不安全的。这个问题有什么替代的解决办法(我必须避免等待)?

EN

Stack Overflow用户

回答已采纳

发布于 2015-12-21 11:17:13

您可以使用专用线程对等待信号使用西格等待。当接收到信号时,等待将被返回,并且给定的线程可以通知正常代码中的其他线程(而不是信号处理程序)。

假设您有暂停和取消暂停线程的函数,如下所示

代码语言:javascript
复制
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);        
}

专用线程可以以这种方式实现:

代码语言:javascript
复制
// 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();
    }
}
票数 5
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34386514

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档