pthread - Pausing/Unpausing 所有线程

pthread - Pausing/Unpausing all threads

我正在尝试在我的应用程序中编写 pause/unpause 所有线程,它由 SIGUSR1(暂停)和 SIGUSR2(取消暂停)激活。我想在所有线程中使用 pthread_cond_wait(),当收到信号时,有条件地使用 pthread_cond_broadcast() 我会挂起所有线程,但显然在信号处理程序中使用 pthread_cond_broadcast() 是不安全的...这个问题有没有其他解决方案(我必须避免忙等待)?

你有没有尝试过这样的事情:

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。这可以放在线程执行周期中的战略位置。对于您的场景,您可以在线程检查消息队列中是否有任何消息之后放置这段代码。

您可以使用专用线程来使用 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();
    }
}