- std::thread::hardware_concurrency(); 可以用来获得当前CPU最多一次性可以并发多少个线程,但是结果仅供参考
- 可以用get_id() 函数来获得线程id
- 可以使用std::once_flag + std::call_once 来保护只需要同步一次的代码 参考:3.3.1
- 可以通过std::shared_mutex 来实现c++ 版本的读写锁,需要 c++ 14的支持。例:
#include <shared_mutex>
std::shared_mutex sm;
void readData()
{
std::shared_lock<std::shared_mutex> lk(sm);
}
void writeData()
{
std::unique_lock<std::shared_mutex> lk(sm);
}
- 可以使用 std::recursive_mutex 来规避嵌套调用时单用std::mutex 会造成死锁的问题,不过建议慎重使用,如果要用到recursive_mutex时,基本意味着代码的逻辑层次可能有问题
- condition_variable 需要用 unique_lock 配合的原因在于,unique_lock 更加灵活,可以自由的加锁和释放锁,而lock_guard 就做不到。
- 可以通过设置std:::async 来构造一个异步返回函数,用于需要把一个函数异步执行 但是有需要获取它的返回值的时候
int func1(int val1,std::string& str)
{
int ret = 0;
return ret;
}
int main()
{
std::string dstr("shfe");;
auto fu1 = std::async(std::launch::async, func1, 43, std::ref(dstr));
}
- std::promise 可以在线程间互相传递数据,感觉跟async 有点类似 ,例:
int func1(std::future<int>& fut)
{
int x = fut.get();
return x;
}
int main()
{
std::promise<int> prom;
std::future<int> fut = prom.get_future();
std::thread fuT(func1, std::ref(fut));
prom.set_value(333);
}