C++11 多线程入门:mutex 和 condition_variable

先上代码:

#include
#include
#include 
#include
using namespace std;
void PrintId(int id)
{
	cout<<"ID:"<

输出:C++11 多线程入门:mutex 和 condition_variable_第1张图片

改一下,加上互斥量mutex:(PrintId(int id)改变,main()不变)

mutex mu;
void PrintId(int id)
{
	mu.lock();
	cout<<"ID:"<

输出:C++11 多线程入门:mutex 和 condition_variable_第2张图片

mutex常用方法:.lock() .unlock() .try_lock();   

互斥变量一共四种:std::mutex    std::timed_mutex    std::recursive_mutex    std::recursive_timed_mutex 想了解可以搜一下。

再改一下:

mutex mu;
void PrintId(int id)
{
	lock_guard lg(mu);//或者 unique_lock ul(mu);  
	cout<<"ID:"<

输出和上一个一样。

lock_guard和unique_lock:用来自动上锁和解锁。模板类,模板类型可以为上面4种互斥量。其中,unique_lock更灵活好用,可以和condition_variable配合,实现线程间同步。更详细的自己找吧。

下面再改下代码,加上条件变量:

mutex mu;
condition_variable cv;
bool print = false;
void PrintId(int id)
{
	unique_lock ul(mu);
	while (print == false)   //如果print为false 就一直等待
	{
		cv.wait(ul);
	}
	cout<<"ID:"< ul(mu);
	print = true;
	cv.notify_all();  
}
int main()
{
    thread threads[10];
	for (int i = 0;i < 10;i++)
	{
		threads[i] = thread(PrintId,i);
	}
	StartPrint();
	for (auto & t : threads)
	{
		t.join();
	}	
	return 0;
}

输出:

为啥输出顺序和之前不一样呢?因为唤醒了10个线程,哪个线程先开始输出谁知道呢。

更多条件变量参考:https://blog.csdn.net/yapian8/article/details/46638155

你可能感兴趣的:(c++)