条件変数の理解をテストするプログラムを作成しています。基本的に、スレッド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以外の何者かを助けてください。ありがとう!
偶数スレッドは、countが奇数になるとすぐに信号を呼び出します。したがって、奇数のスレッドはロックを取得し、wait()呼び出しの後に続き、カウントをインクリメントします。それからロックが解除され、偶数のスレッドがロックを取得し、サイクルが続行されます。 –
あなたは 'pthread_mutex_t'と' pthread_cond_t'を適切に初期化しません。 – EOF
私はそれが直面していた問題の理由ではないと思います。実際、私はスレッド(0)の代わりに0を渡すことでjoin()への呼び出しを混乱させました。 –