我正在尝试编写一个可以创建10个线程的程序。收到SIGUSR1信号后的那些线程应该全部停止,并且在收到SIGUSR2之后应该继续做他们正在做的事情。
我已经写了这段代码(顺便说一句。你也可以检查一下它的正确性吗?谢谢!)但我认为当信号SIGUSR1发生时,只有1个线程会收到并处理它(这意味着只有1个线程将继续其工作...)。
如何使所有等待的线程继续工作?
void handle_sigusr1()
{
int sig;
sigset_t set;
sigemptyset(&set);
sigaddset(&set, SIGUSR2);
printf("Thread waiting for some signal SIGUSR2! \n");
sigwait(&set, &sig);
}
void install_sigusr1()
{
struct sigaction setup_action;
sigset_t block_mask;
sigfillset(&block_mask);
setup_action.sa_handler = handle_sigusr1;
setup_action.sa_mask = block_mask;
setup_action.sa_flags = 0;
if (sigaction (SIGUSR1, &setup_action, 0) == -1)
fprintf(stderr, "sigaction2 err");
}
void* test_thread_func(void * data)
{
while(1)
{
...
Some SIGUSR1 signal may occur ...
...
}
}
void create_threads()
{
pthread_t TH[10];
int i;
sigset_t set;
sigfillset(&set);
sigdelset(&set, SIGUSR1);
sigdelset(&set, SIGUSR2);
pthread_sigmask(SIG_SETMASK, &set, NULL);
install_sigusr1();
/* Block all signals except for SIGUSR1 and SIGUSR2. New Threads will
inherit the sigmask ...*/
pthread_attr_t attr;
pthread_attr_init(&attr);
for(i = 0; i < 10; i++)
{
pthread_create(TH[i], &attr, test_thread_func, 0);
}
// now we unblock SIGINT so that the main thread only can handle SIGINT signal
sigdelset(&set, SIGINT);
// we dont want the main thread to handle SIGUSRs signals ...
sigaddset(&set, SIGUSR1);
sigaddset(&set, SIGUSR2);
pthread_sigmask(SIG_SETMASK, &set, NULL);
while(1);
}
答案 0 :(得分:1)
如何使所有等待的线程继续工作?
pthread_cond_broadcast()函数将取消阻止当前在指定条件变量cond上阻塞的所有线程。
我写过这段代码(顺便说一下。你能不能检查一下 正确吗?)
对于这篇文章您的完整代码。这是我可以从你的问题中告诉你的事情。