2016-11-11 61 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',只有当它不轮到你时才会这样。但你不检查。 –