使用C++ 多线程交替打印

//无锁实现

#include <iostream>
#include <thread>
using namespace std;
int number;
const int MAXNUM = 10;    // 输出范围:1 - MAXNUM
// 打印奇数
void add_1() {
    
    
    while (1) {
    
    
        if (number % 2 == 0) {
    
    
            int temp_number = number;       // 读出 number
            temp_number = temp_number + 1;  // 加1
            cout << "mythread_1: " << temp_number << endl;    // 输出
            number = temp_number;           // 写回 number
            if (temp_number == MAXNUM - 1) {
    
    
                break;
            }
        }
    }
    cout  << "mythread_1 finish" << endl;     // mythread_1完成
}
// 打印偶数
void add_2() {
    
    
    while (1) {
    
    
        if (number % 2 == 1) {
    
    
            int temp_number = number;       // 读出 number
            temp_number = temp_number + 1;  // 加1
            cout << "mythread_2: " << temp_number << endl;    // 输出
            number = temp_number;           // 写回 number
            if (temp_number == MAXNUM) {
    
    
                break;
            }
        }
    }
    cout  << "mythread_2 finish" << endl;     // mythread_2完成
}
int main() {
    
    
    number = 0;
    cout << endl << "Create and Start!" << endl;
    thread mythread_1(add_1);	// 打印奇数
    thread mythread_2(add_2);	// 打印偶数
    mythread_1.join();
    mythread_2.join();
    cout << endl << "Finish and Exit!" << endl;
    return 0;
}

在这里插入图片描述

加锁实现

#include <iostream>
#include <thread>
#include <mutex>
using namespace std;
int number;
mutex mutex_number;
const int MAXNUM = 10;
// 打印奇数
void add_1() {
    
    
    while (1) {
    
    
        mutex_number.lock();
        if (number >= MAXNUM) {
    
    
            mutex_number.unlock();
            break;
        }
        if (number % 2 == 0) {
    
    
            number++;
            cout << "mythread_1: " << number << endl;    // 输出
        }
        mutex_number.unlock();
    }
    cout  << "mythread_1 finish" << endl;     // mythread_1完成
}
// 打印偶数
void add_2() {
    
    
    while (1) {
    
    
        mutex_number.lock();
        if (number >= MAXNUM) {
    
    
            mutex_number.unlock();
            break;
        }
        if (number % 2 == 1) {
    
    
            number++;
            cout << "mythread_2: " << number << endl;    // 输出
        }
        mutex_number.unlock();
    }
    cout  << "mythread_2 finish" << endl;     // mythread_2完成
}
int main() {
    
    
    number = 0;
    cout << endl << "Create and Start!" << endl;
    thread mythread_1(add_1);
    thread mythread_2(add_2);
    mythread_1.join();
    mythread_2.join();
    cout << endl << "Finish and Exit!" << endl;
    return 0;
} 

在这里插入图片描述

打印零与奇偶数

class ZeroEvenOdd {
    
    
private:
    int n;
    pthread_mutex_t mutex0;
    pthread_mutex_t mutex1;
    pthread_mutex_t mutex2;
public:
    ZeroEvenOdd(int n) {
    
    
        this->n = n;
        pthread_mutex_init(&mutex0, NULL);
        pthread_mutex_init(&mutex1, NULL);
        pthread_mutex_init(&mutex2, NULL);
        //lock
        pthread_mutex_lock(&mutex1);
        pthread_mutex_lock(&mutex2);        
    }
    // printNumber(x) outputs "x", where x is an integer.
    void zero(function<void(int)> printNumber) {
    
    
        for(int i = 1; i <= n; i++) {
    
    
            pthread_mutex_lock(&mutex0);
            printNumber(0);
            if(i & 1) pthread_mutex_unlock(&mutex1);
            else pthread_mutex_unlock(&mutex2);
        }
    }
    void even(function<void(int)> printNumber) {
    
    
        for(int i = 2; i <= n; i+=2) {
    
    
            pthread_mutex_lock(&mutex2);
            printNumber(i);
            pthread_mutex_unlock(&mutex0); 
        }
    }
    void odd(function<void(int)> printNumber) {
    
    
        for(int i = 1; i <= n; i+=2) {
    
    
            pthread_mutex_lock(&mutex1);
            printNumber(i);
            pthread_mutex_unlock(&mutex0); 
        }  
    }
};

猜你喜欢

转载自blog.csdn.net/m0_46717588/article/details/119953688