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

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

posted @ 2016-06-01 16:07  Esapinit  阅读(4365)  评论(0编辑  收藏  举报