linux c++は2つのスレッドを交互に1~100印刷することを実現する
構想:条件変数を使用して、1つのスレッドがcountを待って奇数になり、1つのスレッドがcountを待って偶数になります.
#include
#include
#include
#include
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.
", (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.
", (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;
}