栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++11学习笔记--thread&mutex

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++11学习笔记--thread&mutex

#include 
#include 
#include 
#include 




std::mutex m,n;

void referencefunc(int &num)
{
	num = 100;
}

void bodyfunc(int time)
{
	for (int i = 0; i < time; ++i)
	{
		{//加锁保证下面的打印在一行,不会被其他插入
			std::lock_guard nguard(n);
			std::cout << i << " " << std::this_thread::get_id() << std::endl;;
		}
		std::this_thread::sleep_for(std::chrono::milliseconds(100));
	}
}

void doublelockfunc(int& a, int& b)
{
	//同时控制两个不同的锁,而且需要他们控制的内容同步时
	//建议std::lock和std::lock_guard结合使用。
	//进入范围后m、n既被lock锁住,又可以在离开范围时自动解锁
	//而且不会存在:	不同线程也使用这两把锁时,
	//					由于加锁顺序不同而可能出现的死锁情况
	std::lock(m, n);
	std::lock_guard mguard(m, std::adopt_lock);
	std::lock_guard nguard(n, std::adopt_lock);
	a++;
	b++;
}

void testThread()
{
	int v = 0;
	//使用thread调用lambda形式
	std::thread th1([&v]() {
		referencefunc(v);
	});
	th1.join();
	std::cout << "after lambda v = " << v << std::endl;

	v = 0;
	//使用thread调用函数形式
	std::thread th2(referencefunc, std::ref(v));
	th2.join();
	std::cout << "after thread v = " << v << std::endl;

	int v1 = 0, v2 = 0;
	std::thread th3([&v1, &v2]() { doublelockfunc(v1, v2); });
	th3.join();

	std::thread th(bodyfunc, 10);
	bodyfunc(10);
	th.join();
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/717626.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号