私は2/3スレッドを持つ基本プログラムを構築しようとしています。メインスレッド、シグナルスレッド、およびレシーバスレッド。私はメインスレッドがシグナルと受信スレッドの両方を開始するようにしています。シグナルスレッドは、10個のSIGUSR1シグナルを受信スレッドに送信し、グローバルカウンタを増加させることになっています。受信スレッドは、受信された各信号について自身のカウンタを増加させながら10個の信号を受信することになっている。Cとpthread_joinストールプログラムの信号受信スレッド
私が抱えている問題は、最後にスレッドを一緒に結合して、具体的には受信スレッドに参加することです。受信者のスレッドが完了していない(信号が欠落している可能性があります)ので、プログラムが停止してしまい、終了しないことが想定されます。おそらくこれが当てはまると思っていたので、シグナルプロセッサスレッドにwaitコマンドを導入して速度を落としましたが、何も変わっていませんでした。
pthread_join(受信者、NULL)をコメントアウトすると、プログラムは実行されますが、ほとんどの場合、1つの信号しか捕捉しません。これは、受信側のスレッドが実行に時間がかからないためです。 (受信者、NULL)をプログラムに残すと、19/20回は停止しますが、プログラムは10回の信号を返します。送信され、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