当前位置:  开发笔记 > 程序员 > 正文

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

如何解决《pthread-暂停/取消暂停所有线程》经验,为你挑选了1个好方法。

我试图在我的应用程序中编写一个暂停/取消暂停所有线程,这由SIGUSR1(暂停)和SIGUSR2(取消暂停)激活。我想到要pthread_cond_wait()在所有线程中使用,并且在接收到信号时,pthread_cond_broadcast()在有条件的情况下使用我会挂起所有线程,但是显然pthread_cond_broadcast()在信号处理程序中使用它是不安全的...是否有其他替代方法可以解决此问题(我必须避免忙等)?



1> Tsyvarev..:

您可以使用sigwait将专用线程用于等待信号。接收到信号后,将返回等待状态,并且给定线程可以在正常代码(不是信号处理程序)内通知其他线程。

假设您具有暂停和取消暂停这样的线程的功能

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();
    }
}

推荐阅读
kikokikolove
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有