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

遵循原则:

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;
}

思路2:
C++ 11,VS2019
使用了unique_lock,条件变量
条件变量的wait(), notify_one()
wait()中使用了lambda表达式
代码
#include <iostream>
#include <vector>
#include <thread>
#include <list>
#include <mutex>

using namespace std;

bool flag = true;

class A
{
public:

    void print1()
    {
        while (true)
        {
            std::unique_lock<std::mutex> lock1(print_mutex);
            data_var.wait(lock1, [] {return flag; });
            cout << "thread: " << std::this_thread::get_id() << " print: " << "A" << endl;

            flag = false;
            data_var.notify_one();
        }
    }

    void print2()
    {
        while (true)
        {
            std::this_thread::sleep_for(std::chrono::seconds(1));

            std::unique_lock<std::mutex> lock2(print_mutex);

            data_var.wait(lock2, [] {return !flag; });
            cout << "thread: " << std::this_thread::get_id() << " print: " << "B" << endl;

            flag = true;
            data_var.notify_one();
        }
    }

private:

    std::mutex print_mutex;
    std::condition_variable data_var;
};

int main()
{
    A myobj_a;

    std::thread print1(&A::print1, &myobj_a);
    std::thread print2(&A::print2, &myobj_a);

    print1.join();
    print2.join();

    return 0;
}

C++11多线程编程-两个进程轮流打印1~100相关推荐

  1. java go多线程:两个线程交替打印 0~100 的奇偶数

    最近在实现raft算法,用到了很多go的高并发的知识,看到一道题写两个线程交替打印 1~100 的奇偶数,突然来了兴趣. 题目要求我们要启动两个线程,一个打印奇数,一个打印偶数.中途不能跳出协程. 代 ...

  2. Linux与C++11多线程编程(学习笔记)

    多线程编程与资源同步 在Windows下,主线程退出后,子线程也会被关闭; 在Linux下,主线程退出后,系统不会关闭子线程,这样就产生了僵尸进程 3.2.1创建线程 Linux 线程的创建 #inc ...

  3. 线程打印_面试题:用程序实现两个线程交替打印 0~100 的奇偶数

    作者:dadiyang来源:https://blog.csdn.net/dadiyang/article/details/88315124 面试场景 面试官:Java多线程了解吗?你给我写一下,起两个 ...

  4. c++11多线程编程同步——使用条件变量condition variable

    简述 在多线程编程中,当多个线程之间需要进行某些同步机制时,如某个线程的执行需要另一个线程完成后才能进行,可以使用条件变量. c++11提供的 condition_variable 类是一个同步原语, ...

  5. c++11 多线程编程(一)------初始

    什么是并发 并发在生活中随处可见,边走路边说话,边听歌边写代码.计算机术语中的"并发",指的是在单个系统里同时执行多个独立的活动,而不是顺序的一个接一个的执行.对于单核CPU来说, ...

  6. c++11 多线程编程(六)------条件变量(Condition Variable)

    互斥锁std::mutex是一种最常见的线程间同步的手段,但是在有些情况下不太高效. 假设想实现一个简单的消费者生产者模型,一个线程往队列中放入数据,一个线程往队列中取数据,取数据前需要判断一下队列中 ...

  7. c++11 多线程编程(三)------ 竞争和互斥锁

    竞争条件 并发代码中最常见的错误之一就是竞争条件(race condition).而其中最常见的就是数据竞争(data race),从整体上来看,所有线程之间共享数据的问题,都是修改数据导致的,如果所 ...

  8. C++11多线程编程--线程创建

    参考资料 adam1q84 我是一只C++小小鸟 Thread support library Book:<C++ Concurrency in Action> 线程的创建 线程的创建有多 ...

  9. c++11 多线程编程(五)------unique_lock

    互斥锁保证了线程间的同步,但是却将并行操作变成了串行操作,这对性能有很大的影响,所以我们要尽可能的减小锁定的区域,也就是使用细粒度锁. 这一点lock_guard做的不好,不够灵活,lock_guar ...

最新文章

  1. php 遍历所有的文件
  2. PHP的安装与设置——windos
  3. BZOJ 1047: [HAOI2007]理想的正方形 单调队列瞎搞
  4. linux线程切换回调函数,linux C线程退出回调函数
  5. 人脸识别运行之前需要处理的问题
  6. 从 Web 图标演进历史看最佳实践
  7. 本地差分隐私 随机响应_大数据时代下的隐私保护(二)
  8. 正则表达式 (入门)
  9. 拆分php中 $i++ ++$i PHP中的i++与++i的区别及效率
  10. H3C防火墙透明模式部署trunk
  11. ROS智能车自主导航roslaunch racecar_gazebo racecar_runway_navigation.launch报错
  12. WiFi通信模块框图
  13. Failed to compile with 1 errors
  14. luogu4061 大吉大利,晚上吃鸡!
  15. XSS修炼之独孤九剑——笔记
  16. 微信小程序——商品列表
  17. 10676 涂鸦跳跃(sort)
  18. ssd(Single Shot MultiBox Detector)解读之(一)原理解析
  19. 微型计算机m3500q,联想ThinkCentre M3500q超小商用台式机
  20. 嵌入式的可就业方向有哪些?

热门文章

  1. C# IO操作(五)文件的递归加载
  2. CentOS上 Mono 3.2.8运行ASP.NET MVC4经验
  3. 转:Jbpm4.2 tomcat6 oracle9i安装过程
  4. .NET C/S(WinForm)开发技巧点滴(转)
  5. 小学计算机室教室的简报,高新区第三小学开展“信息技术与教育教学融合创新发展”培训...
  6. [网络安全自学篇] 五十八.Windows安全缺陷利用之再看CVE-2019-0708及反弹shell防御措施
  7. [Python微信开发] 一.itchat入门知识及微信自动回复、微信签名词云分析
  8. HarmonyOS之应用开发的电话服务与蜂窝网络
  9. 2013\National _C_C++_B\4.高僧斗法
  10. Jenkins 创建Maven项目