linux c++實現兩個線程輪流打印1~100

思路:使用條件變量,一個線程等待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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章