你有两个问题。首先是您没有
while()正确使用循环-例如,在这里:
//wait for turnwhile( pthread_cond_wait(&condA, &mutex) != 0 )i++;
在体内
while循环是声明
i++-这将执行
pthread_cond_wait()并
i++直到
pthread_cond_wait()返回一个错误,所以这基本上是一个死循环。
第二个问题是您不能单独使用pthreads条件变量-
它需要与一些实际的共享状态配对(最简单的说,此共享状态可能只是受互斥锁保护的标志变量)。该
pthread_cond_wait()函数用于等待共享状态达到某个值,并且
pthread_cond_signal()当线程更改共享状态时使用该函数。重新编写示例以使用这样的变量:
//global variablesenum { STATE_A, STATE_B } state = STATE_A;pthread_cond_t condA = PTHREAD_COND_INITIALIZER;pthread_cond_t condB = PTHREAD_COND_INITIALIZER;pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;void *threadA(){ int i = 0, rValue, loopNum; while(i<5) { pthread_mutex_lock(&mutex); while (state != STATE_A) pthread_cond_wait(&condA, &mutex); pthread_mutex_unlock(&mutex); //do stuff for(loopNum = 1; loopNum <= 5; loopNum++) printf("Hello %dn", loopNum); pthread_mutex_lock(&mutex); state = STATE_B; pthread_cond_signal(&condB); pthread_mutex_unlock(&mutex); i++; } return 0;}void *threadB(){ int n = 0, rValue; while(n<5) { pthread_mutex_lock(&mutex); while (state != STATE_B) pthread_cond_wait(&condB, &mutex); pthread_mutex_unlock(&mutex); //do stuff printf("Goodbyen"); pthread_mutex_lock(&mutex); state = STATE_A; pthread_cond_signal(&condA); pthread_mutex_unlock(&mutex); n++; } return 0;}需要注意的是使用两个条件变量的
condA和
condB不必要在这里-代码将是一样,如果正确使用的条件只有一个变量,而不是。



