思路:使用條件變量,一個線程等待count變成奇數,一個線程等待count變成偶數。
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
pthread_cond_t cond_odd = PTHREAD_COND_INITIALIZER;
pthread_cond_t cond_even = PTHREAD_COND_INITIALIZER;
pthread_mutex_t mutex_x = PTHREAD_MUTEX_INITIALIZER;
int kCount = 1;
void * countOdd(void * arg){
for(int i=0; i<100;i++){
pthread_mutex_lock(&mutex_x);
if(kCount < 100){
// 當前kCount是偶數,等待
if((kCount%2) == 0) pthread_cond_wait(&cond_odd, &mutex_x);
// 打印奇數
printf("Current Thread: %s, Current Count: %d.\n", (char *)arg, kCount);
// 變成偶數
kCount++;
if((kCount%2) == 0){
pthread_cond_signal(&cond_even);
}
}
pthread_mutex_unlock(&mutex_x);
}
}
void * countEven(void *arg){
for(int i=0;i<100;i++){
pthread_mutex_lock(&mutex_x);
if(kCount < 100){
// 當前kCount是奇數,等待
if((kCount%2) == 1) pthread_cond_wait(&cond_even, &mutex_x);
// 打印偶數
printf("Current Thread: %s, Current Count: %d.\n", (char*)arg, kCount);
// 變成奇數
kCount++;
if((kCount%2) == 1){
pthread_cond_signal(&cond_odd);
}
}
pthread_mutex_unlock(&mutex_x);
}
}
int main(int argc, char* argv[]){
pthread_t tids[2];
int i;
if(pthread_create(&tids[0], NULL, countOdd, (void*)("1"))){
printf("pthread_creat_error");
}
if(pthread_create(&tids[1], NULL, countEven, (void*)("2"))){
printf("pthread_creat_error");
}
sleep(3);
for(i = 0;i < 2; i++){
if(pthread_join(tids[i], NULL)){
printf("pthread_join error");
return -1;
}
}
return 0;
}