2016-10-18 16 views
0

pthread_cond_wait()pthread_cond_signal()を使用してマルチスレッドプログラムを作成しています。条件が正しくても正常に動作していますが、条件が正しくない、動作していない、機能が無視されていない場合は、printinput()、ここに留まり、継続しません。このエラーをチェックするのを手伝ってもらえますか?pthread_cond_signal()とpthread_cond_wait()を使用してpthreadが動作しない

マイコード:

#include <stdio.h> 
#include <stdlib.h> 
#include <pthread.h> 

pthread_mutex_t mutex; 
pthread_cond_t cond; 

//Read input value 
void* readinput(void *arg) 
{ 
    pthread_mutex_lock(&mutex); 
     int a; 
     printf("Input:"); 
     scanf("%d",&a); 
     printf("Value: %d\n",a); 
     /* 
     if condition correct then "printinput" function 
     else ignore that function 
     */ 
     if (a>=2 && a<=8) 
     { 
      pthread_cond_signal(&cond); 
     } 
    pthread_mutex_unlock(&mutex); 
    pthread_exit((void *)a); 
} 

//print input value if condition correctly 
void* printinput(void *arg) 
{ 
    pthread_mutex_lock(&mutex); 
    //Block and wait for cond Singal 
     pthread_cond_wait(&cond,&mutex); 
     printf("Your value between 2 and 8 \n\n"); 
    pthread_mutex_unlock(&mutex); 
    pthread_exit(NULL); 
} 
int main() 
{ 
    pthread_mutex_init(&mutex, NULL); 
    pthread_cond_init(&cond, NULL); 
    pthread_t th1; 
    pthread_t th2; 
    while (1) 
    { 

     //Create pthread 
     pthread_create(&th1,NULL,&printinput,NULL); 
     pthread_create(&th2,NULL,&readinput,NULL); 

     //Wait pthread done 
     pthread_join(th1,NULL); 
     pthread_join(th2,NULL); 
     Sleep(1000); 
    } 
} 

結果:該当する状態が通知されるまで

Input:5 
Value: 5 
Your value between 2 and 8 
Input:10 Value: 10 

答えて

0

pthread_cond_wait()は、現在のスレッドを中断します。

入力の場合、5最初のスレッドは、条件がif (a >= 2 && a <= 8)ブロックの一部であることを知らせます。

入力の場合、10上記のブロックはスキップされ、条件は通知されません。したがって、2番目のスレッドは決して目が覚まらず、永久にスタックされます。

さらに、競合状態があることに注意してください。プログラムが頻繁に動作していることに私は実際に驚いています。第1のスレッドがミューテックスをロックする場合、第2のスレッドは第1のスレッド機能が終了するまでミューテックスセクションに入らないので、その条件のウェイトが呼び出される前にその条件が通知される。このような状況では、2番目のスレッドは永遠にスタックされます。

期待通りに動作するソリューション(つまり、第2スレッドの最初のスレッドからtrue/falseを消費する)の場合、最初のスレッドが出力を送信し、2番目のスレッドがそれを消費するキューを実装することをお勧めします。競合状態も修正されます。実装については、例えばhttps://stackoverflow.com/a/4577987/4787126

を参照してください。
関連する問題