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  // 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 对象.
		std::future<int> fut = prom.get_future(); // 和 future 关联.
		std::thread fuT(func1, std::ref(fut));
		prom.set_value(333); // set完后就会传递值
	}

你可能感兴趣的:(c++,笔记,开发语言)