我有两个线程(线程1和线程2)。我有SIGINT
的信号处理。每当SIGINT
发生时,线程2应该处理信号。为此,我编写了以下程序
#include <pthread.h>
#include <signal.h>
#include <stdio.h>
void sig_hand(int no) //signal handler
{
printf("handler executing...\n");
getchar();
}
void* thread1(void *arg1) //thread1
{
while(1) {
printf("thread1 active\n");
sleep(1);
}
}
void * thread2(void * arg2) //thread2
{
signal(2, sig_hand);
while(1) {
printf("thread2 active\n");
sleep(3);
}
}
int main()
{
pthread_t t1;
pthread_t t2;
pthread_create(&t1, NULL, thread1, NULL);
pthread_create(&t2, NULL, thread2, NULL);
while(1);
}
我编译并运行程序。每1秒打印一次“thread1 active”,每3秒打印一次“thread2 active”。
现在我生成了SIGINT
。但是它打印“thread1 active”和“thread2 active”消息,就像上面一样。我再次生成了SIGINT
,现在每3秒只打印“thread2 active”消息。我再次生成了SIGINT
,现在所有线程都被阻塞了。
所以我明白了,第一次主线程执行信号处理程序,第二次线程1执行处理程序,最后线程2执行信号处理程序。
我如何编写这样的代码:每当信号发生时,只有thread2必须执行我的信号处理程序?
2条答案
按热度按时间ncecgwcz1#
如果向进程发送信号,则进程中的哪个线程将处理此信号是不确定的。
根据
pthread(7)
:POSIX. 1还要求线程共享一系列其他属性(即,这些属性是进程范围的,而不是每个线程的):
...
...
POSIX. 1区分了指向整个进程的信号和指向单个线程的信号。根据POSIX. 1,一个指向进程的信号(例如,使用
kill(2)
发送)应该由进程中的一个单一的、任意选择的线程处理。如果您希望进程中有一个专用线程来处理某些信号,下面是
pthread_sigmask(3)
中的一个示例,向您展示了如何做到这一点:下面的程序阻塞了主线程中的一些信号,然后创建了一个专用线程来通过sigwait(3)获取这些信号用途:
程序源
djp7away2#
仔细阅读signal(7)、pthread(7)、pthread_kill(3)、sigprocmask(2)和pthread_sigmask(3)--你可以使用它们(阻止不需要的线程中的
SIGINT
)。避免使用信号在线程之间进行通信或同步。考虑互斥锁(pthread_mutex_lock等)和条件变量(pthread_cond_wait等)。
如果其中一个线程运行event loop(例如poll(2)附近...),请考虑使用signalfd(2)。