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();
}
}
我正在尝试在我的应用程序中编写 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();
}
}