2016-11-11 72 views
0

我正在編寫一個程序來測試我對條件變量的理解。基本上,線程0檢查計數是否均勻,如果是,則遞增計數。如果沒有,那麼它表示線程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); 
} 

誰能告訴我爲什麼我收到分段錯誤(核心轉儲)誤差呢?我知道當一個進程試圖違反其他進程的地址空間時會發生這個錯誤,但是除此之外沒有其他的東西。可以有人請幫忙嗎?謝謝!

+0

事情是偶數線程一旦計數爲奇數就調用信號。因此,奇數線程獲得鎖並在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',只有當它不輪到你時纔會這樣。但你不檢查。 –