c++库thread实践

 

前述

对c++11的thread进行应用

尝试

1.两个线程交替打印字母

#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>

void printa(bool& flag, std::mutex& mtx, std::condition_variable& cv) {
    for (;;) {
        std::unique_lock<std::mutex> la(mtx);
        // 利用条件变量控制unique_lock的加锁、解锁状态
        // wait(unique_lock <mutex>&lck,Predicate pred)
        // wait在pred返回为false时阻塞
        cv.wait(la, [&](){return flag;});
        std::cout << "a";
        flag = !flag;
        // 解除阻塞在等待的一个线程 如果有多个线程无法指定特定线程
        // 当然这里也可以用cv.notify_all()  解除所有等待中线程的阻塞
        cv.notify_one();
    }
}

void printb(bool& flag, std::mutex& mtx, std::condition_variable& cv) {
    for (;;) {
        std::unique_lock<std::mutex> lb(mtx);
        cv.wait(lb, [&](){return !flag;});
        std::cout << "b";
        flag = !flag;
        cv.notify_one();
    }
}

int main() {
    bool f = true;
    std::mutex mtx;
    std::condition_variable cv;
    std::thread a(printa, std::ref(f), std::ref(mtx), std::ref(cv));
    std::thread b(printb, std::ref(f), std::ref(mtx), std::ref(cv));

    a.join();
    b.join();

    return 0;
}