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

  • 相关阅读:
    Shiro入门
    Springmvc 文件上传和json处理
    SpringMVC入门
    Mybatis关联关系
    Mybatis整合Ehcache或Redis实现二级缓存
    mybatis与spring集成
    mybatis动态sql以及分页
    MyBatis入门
    使用java代码操作Redis
    【转】 制作Android Demo GIF:程序演示效果GIF图录制
  • 原文地址:https://www.cnblogs.com/lfri/p/12419418.html
Copyright © 2011-2022 走看看