2016-11-11 16 views
0

条件変数の理解をテストするプログラムを作成しています。基本的に、スレッド0はcountが偶数であるかどうかをチェックし、偶数であればインクリメントします。そうでなければ、スレッド1に信号を送り、カウント変数をインクリメントする。カウントはここ15に到達するまでのプロセスは継続し、私のコードです:私はこれでセグメンテーションフォールト(コアダンプ)のエラーを取得していますなぜpthreadsを使用したセグメンテーションフォルト

#include <pthread.h> 
#include <stdio.h> 
#define numThreads 2 

int count=0; 
pthread_mutex_t count_mutex; 
pthread_cond_t count_threshold_cv; 


void *checkEven(void *threadId) 
{ while(count<=15){ 
//lock the mutex 
pthread_mutex_lock(&count_mutex); 
printf("even_thread: thread_id=%d count=%d\n",threadId,count); 
if(count%2==0){ 
count++; 
} 
else{ 
printf("Odd count found, signalling to odd thread\n"); 
pthread_cond_signal(&count_threshold_cv); 
} 
pthread_mutex_unlock(&count_mutex); 
sleep(1); 
} 
} 

void *checkOdd(void *threadId) 
{ 
pthread_mutex_lock(&count_mutex); //obtain a lock 
while(count<=15){ 
pthread_cond_wait(&count_threshold_cv, &count_mutex); //wait() relinquishes the lock 
count++; 
printf("odd_thread: thread_id=%d, count=%d\n",threadId,count); 
} 
pthread_mutex_unlock(&count_mutex); 
pthread_exit(NULL); 
} 

int main() 
{ 
pthread_t threads[numThreads]; 
int rc; 
int a=0; 
int b=0; 
pthread_create(&threads[0], NULL, checkEven, (void *)a); 
pthread_create(&threads[1], NULL, checkEven, (void *)b); 
pthread_join(0,NULL); 
pthread_join(1,NULL); 
pthread_exit(NULL); 
} 

誰かが私に言うことはできますか?このエラーは、あるプロセスが他のプロセスのアドレス空間に違反しようとしたときに発生しますが、this.Can以外の何者かを助けてください。ありがとう!

+0

偶数スレッドは、countが奇数になるとすぐに信号を呼び出します。したがって、奇数のスレッドはロックを取得し、wait()呼び出しの後に続き、カウントをインクリメントします。それからロックが解除され、偶数のスレッドがロックを取得し、サイクルが続行されます。 –

+1

あなたは 'pthread_mutex_t'と' pthread_cond_t'を適切に初期化しません。 – EOF

+0

私はそれが直面していた問題の理由ではないと思います。実際、私はスレッド(0)の代わりに0を渡すことでjoin()への呼び出しを混乱させました。 –

答えて

2

あなたが参加したいスレッドとしてpthread_joinにゼロを渡している:

pthread_join(0,NULL); 

あなたが望んでいた:

pthread_join(threads[0],NULL); 
pthread_join(threads[1],NULL); 

あなたはしかし、他のいくつかのバグを持っています。あなたの​​コードは、そのスレッドのターンであっても、pthread_cond_waitを呼び出します。

あなたは条件変数を理解していないようです。具体的には、あなたは、何らかの形で、あなたが待っているものが起きたかどうかを知ることができると考えているようです。条件変数はステートレスです。待っているものとそれが起こったかどうかを追跡するのはあなたの仕事です。

+0

しかし、偶数番目のスレッドからシグナルが送られてくると、wait()の後も処理が続行されませんか? –

+0

@PrashantPandeyはい、偶数番目のスレッドが偶数番目のスレッドの場合にのみ、偶数番目のスレッドだけがそれを通知します。あなたがすでにあなたのターンであってもあなたが待っていれば、あなたは永遠に待っています。 –

+0

条件変数は、スレッドの順番がわからない。 'pthread_cond_wait'を呼び出すと、待機するかどうかを待機します。あなたが100%あなたが待っていると確信していない限り、 'pthread_cond_wait'を呼び出さないでください。しかし、あなたはチェックしていません。 –

関連する問題