一点笔记,后续展开。
thread给线程函数传参默认是值传递,如果需要引用传递,使用std::ref对参数取引用。或是使用std::move取右值引用,前提是参数传递后不会在原线程使用。
std::thread::hardware_concurrency()获取CPU个数,对设置线程数有很大的参考意义。
std::lock
使用死锁避免算法来Lock给定的Lockable的对象lock1,lock2,...,lockn,以防止死锁。
The objects are locked by an unspecifiedseries of calls to lock, try_lock, unlock. If a call to lock or unlock resultsin an exception, unlock is called for any locked objects before rethrowing.
std::lock(m_mutex1, m_mutex2);
std::lock_guard<std::mutex>locker1(m_mutex1, std::adopt_lock);
std::lock_guard<std::mutex>locker2(m_mutex2, std::adopt_lock);
// std::adopt_lock假定当前线程已经获得互斥对象的所有权,所以不再请求锁。
unique_lock比lock_guard更加灵活。
可以控制加锁的范围。
可以在构造函数中增加std::defer_lock参数(lock_guard不支持),表示先不请求锁。
可以多次加锁解锁。
lock_guard和unique_lock都不能复制,但unique_lock可以移动。
lock_guard性能要高些。
条件变量与锁共用,使用unique_lock,不能使用lock_guard,因为有重复的加解锁动作。
条件变量虚假唤醒(cond_signal或notify_one可能会唤醒多个等待线程),解决:pthread中使用while判断是否wait。C++11中在wait中增加判断条件。
异步编程
std::promise
std::future
std::shared_future
std::async
std::packaged_task