zoukankan      html  css  js  c++  java
  • c++并发练习---多线程顺序打印

    参考:http://blog.csdn.net/liuxuejiang158blog/article/details/22061267

    题目:编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。

    解析:最近在看c++11的并发编程,看到这题最开始的思路是想到了应该使用锁和条件变量的知识(貌似也只有对于lock类型的多线程编程大都使用这两种/(ㄒoㄒ)/~~),这题的关键点在于同步的问题,在这里我使用了一个flag全局变量,用来和条件变量控制同步,而在C++11中条件变量有两种方法notify_one和notify_all,多线程的话(3个及以上),我们需要使用notify_all配合辅助变量来实现同步控制。

    #include<iostream>
    #include<thread>
    #include<mutex>
    #include<condition_variable>
    
    std::condition_variable cond;
    std::mutex print_mutex;
    int flag = 0;
    
    void print_thread(int num)
    {
    	for (int i = 0; i < 10; i++)
    	{
    		std::unique_lock<std::mutex> lk(print_mutex);
    		cond.wait(lk, [&]() {return num == flag; });
    		std::cout << char('A' + num);
    		flag = (flag + 1) % 3;
    		cond.notify_all();
    	}
    }
    
    int main()
    {
    	std::thread t1(print_thread, 1);
    	std::thread t2(print_thread, 2);
    	print_thread(0);
    	t1.join();
    	t2.join();
    }
    

      如果有问题,大家尽快联系我,欢迎讨论,互相进步!

  • 相关阅读:
    ThreadLocal
    volatile的理解
    二叉搜索树
    springboot中URL带有斜杠的转义字符%2F导致的400错误
    深入理解字符串
    Gradle安装与Idea配置
    基本数据类型和包装类
    Windows系统MongoDB安装
    Java程序是如何执行的?
    sshd服务器搭建管理和防止暴力破解
  • 原文地址:https://www.cnblogs.com/break-python/p/5549972.html
Copyright © 2011-2022 走看看