zoukankan      html  css  js  c++  java
  • C++11多线程编程-两个进程轮流打印1~100

    这是经典的同步互斥问题,

    遵循原则:

    1、条件变量需要锁的保护;
    2、锁需要条件变量成立后,后重新上锁;

    参考代码:

    //notify_one()(随机唤醒一个等待的线程)
    //notify_all()(唤醒所有等待的线程)
    //Create By@herongwei 2019/09/10
    
    #include <bits/stdc++.h>
    #include <mutex>
    #include <thread>
    #include <condition_variable>
    using namespace std;
    
    std::mutex data_mutex;//互斥锁
    std::condition_variable data_var;//条件变量
    bool flag = true;
    void printfA() {
        int i = 1;
        while(i <= 100) {
            //休息1秒
            //std::this_thread::sleep_for(std::chrono::seconds(1));
            std::unique_lock<std::mutex> lck(data_mutex);
            data_var.wait(lck,[]{return flag;});//等待flag=true才打印奇数
            std::cout<<"A " << i <<endl;
            i += 2;
            flag = false;
            data_var.notify_one();
        }
    }
    
    void printfB() {
        int i = 2;
        while(i <= 100) {
            std::unique_lock<std::mutex> lck(data_mutex);
            data_var.wait(lck,[]{return !flag;});//等待flag=false才打印偶数
            std::cout<<"B " << i <<endl;
            i += 2;
            flag = true;
            data_var.notify_one();
        }
    }
    int main() {
        // freopen("in.txt","r",stdin);
        std::thread tA(printfA);
        std::thread tB(printfB);
        tA.join();
        tB.join();
        return 0;
    }

    参考链接:https://zhuanlan.zhihu.com/p/82352463

  • 相关阅读:
    HTTP协议详解【转】
    Spring中的IOC和AOP
    Servlet生命周期
    Struts2基本原理【转】
    继承映射的三种方式
    树状数组(两个树状数组累计)
    二维数组数组(区间更新+单点查询)
    东西海岸(逆序对)
    离散化+单点更新+区间求和
    单调栈+dp
  • 原文地址:https://www.cnblogs.com/lfri/p/12419418.html
Copyright © 2011-2022 走看看