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(); }
如果有问题,大家尽快联系我,欢迎讨论,互相进步!