c++併發練習---多線程順序打印

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

題目:編寫一個程序,開啓3個線程,這3個線程的ID分別爲A、B、C,每一個線程將本身的ID在屏幕上打印10遍,要求輸出結果必須按ABC的順序顯示;如:ABCABC….依次遞推。c++

解析:最近在看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();
}

  若是有問題,你們儘快聯繫我,歡迎討論,互相進步!多線程

相關文章
相關標籤/搜索