c++ 并发编程实战笔记

  1. std::thread::hardware_concurrency(); 可以用来获得当前CPU最多一次性可以并发多少个线程,但是结果仅供参考
  2. 可以用get_id() 函数来获得线程id
  3. 可以使用std::once_flag + std::call_once 来保护只需要同步一次的代码 参考:3.3.1
  4. 可以通过std::shared_mutex 来实现c++ 版本的读写锁,需要 c++ 14的支持。例:
#include <shared_mutex> // msvc
std::shared_mutex sm;
void readData()
{
	std::shared_lock<std::shared_mutex> lk(sm); // read data lock
	// todo
}

void writeData()
{
	std::unique_lock<std::shared_mutex> lk(sm);  //write data lock
	// todo
}
  1. 可以使用 std::recursive_mutex 来规避嵌套调用时单用std::mutex 会造成死锁的问题,不过建议慎重使用,如果要用到recursive_mutex时,基本意味着代码的逻辑层次可能有问题
  2. condition_variable 需要用 unique_lock 配合的原因在于,unique_lock 更加灵活,可以自由的加锁和释放锁,而lock_guard 就做不到。
  3. 可以通过设置std:::async 来构造一个异步返回函数,用于需要把一个函数异步执行 但是有需要获取它的返回值的时候
int func1(int val1,std::string& str)
{
	int ret = 0;
	return ret;
}

int main()
{
	std::string dstr("shfe");;
	// std::launch::async 表示立即执行 
	auto fu1 = std::async(std::launch::async, func1, 43, std::ref(dstr));
}
  1. std::promise 可以在线程间互相传递数据,感觉跟async 有点类似 ,例:
	int func1(std::future<int>& fut)
	{
		int x = fut.get(); // 请注意这里会一直阻塞,等待值的更新
		return x;
	}
	int main()
	{
		std::promise<int> prom; // 生成一个 std::promise<int> 对象.
		std::future<int> fut = prom.get_future(); // 和 future 关联.
		std::thread fuT(func1, std::ref(fut));
		prom.set_value(333); // set完后就会传递值
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值