我正在尝试构建一个包含2/3线程的基本程序。主线程,信号线程和接收线程。我正在努力让主线程启动一个信号线和接收线程。然后信号线程应该向接收线程发送10个SIGUSR1信号并增加一个全局计数器。接收器线程应该接收10个信号,同时为每个接收到的信号增加自己的计数器。C和pthread_join拖延程序中的信号接收线程
我遇到的麻烦是在最后加入线程,特别是加入接收线程。如果我尝试将它们重新组合在一起,大部分时间程序都会停顿,我假设因为接收线程还没有完成它的工作(也许它错过了信号?),所以它永远不会结束。我想也许是这样,所以我在信号线程中引入了一个等待命令来减慢速度,但这并没有改变任何东西。
如果我注释掉pthread_join(receiver,NULL),程序将运行,但它大部分时间只捕获一个信号。我认为这是因为接收线程没有多少时间来运行。 (尽管它有时会捕获不同数量,取决于它被抢占的时间?)
离开程序中的pthread_join(接收器,NULL)使其失速19/20次,但程序返回10个信号的时间为1/20次发送和10收到。这使我相信它与抢先有关,但我不明白为什么它会摆在首位。
此外我现在只有接收器线程接收线程,而接收到的计数器是< 10.理想情况下,我只想将它留在while(1)循环中,但后来我不知道如何加入回到主线程中而不会冻结所有内容。
如果有人能帮我找出为什么信号错过/为什么程序冻结,我将非常感激。我怀疑我没有正确设置接收器的信号掩码,但我不知道我该怎么做。这里是代码:
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <signal.h>
void *receivetest(void *args);
void *signaltest(void *args);
int received = 0;
int sent = 0;
pthread_t signaler;
pthread_t receiver;
sigset_t mask;
int main(){
//setting up the signal mask
sigemptyset(&mask);
sigaddset(&mask, SIGUSR1);
//creation of both threads
pthread_create(&receiver, NULL, receivetest, NULL);
pthread_create(&signaler, NULL, signaltest, NULL);
pthread_join(signaler, NULL);
pthread_join(receiver, NULL);
//printing results after joining them back
printf("I'm the main function\n");
printf("Receieved: %d, sent: %d\n", received, sent);
}
void *signaltest(void *args){
int i = 0;
for(i=0;i<10;i++){ //sends 10 signals to receiver thread
pthread_kill(receiver, SIGUSR1);
sent++;
}
}
void *receivetest(void *args){
int c; //sigwait needs int
pthread_sigmask(SIG_BLOCK, &mask, NULL); //sets up the signal mask for this thread
while(received < 10){ //waits for 10 signals and increments receieved
sigwait(&mask, &c);
received++;
}
}
什么是你真正想干什么?你为什么试图将信号用作线程间通信机制? –
'pthread_sigmask(SIG_BLOCK,&mask,NULL);'表示阻止'mask'中定义的所有信号。这应该被放置在主线程中,因此到达主线程的任何信号都将被传递给信号处理程序。这意味着信号接收器从不处理任何信号。它阻止了他们。 – alvits