1 thread类 thread f; 线程等待join() 线程分离detach()
thread类不可拷贝复制
std::this_thread::yield();
2 bind 与lambda表达式
3 move void some_function(); void some_other_function(); std::thread t1(some_function); // 1 std::thread t2=std::move(t1); // 2 t1=std::thread(some_other_function); // 3 std::thread t3; // 4 t3=std::move(t2); // 5 t1=std::move(t3); // 6 由于t1 已经与一个线程相关联, 赋值操作将使程序崩溃 。 必须显式地等待线程完成或者分离它
4 mutex 用法 std::mutex some_mutex; some_mutex.lock() some_mutex.unlock()
策略 tag type 描述 (默认) 无 请求锁,阻塞当前线程直到成功获得锁。 std::defer_lock std::defer_lock_t 不请求锁。 std::try_to_lock std::try_to_lock_t 尝试请求锁,但不阻塞线程,锁不可用时也会立即返回。 std::adopt_lock std::adopt_lock_t 假定当前线程已经获得互斥对象的所有权,所以不再请求锁。
策略 std::lock_guard std::unique_lock std::shared_lock (默认) √ √ √(共享) std::defer_lock × √ √ std::try_to_lock × √ √ std::adopt_lock √ √ √
//unique_lock 可防止死锁 std::mutex mt1, mt2; // thread 1 { std::unique_lock<std::mutex> lck1(mt1, std::defer_lock); std::unique_lock<std::mutex> lck2(mt2, std::defer_lock); std::lock(lck1, lck2); // do something } // thread 2 { std::unique_lock<std::mutex> lck1(mt1, std::defer_lock); std::unique_lock<std::mutex> lck2(mt2, std::defer_lock); std::lock(lck2, lck1); // do something }
配合std::condition_variable, 在wait时释放锁
//lock_guard 自动析构 std::lock_guard<std::mutex> guard(some_mutex);
5 atomic 内存模型 memory_order_release,memory_order_relaxed,memory_order_consume,memory_order_acquire,memoyr_order_acq_rel,memory_order_seq_cst(默认)
std::atomic_flag f = ATOMIC_FLAG_INIT; // 不能拷贝构造
std::atomic<bool> b(true); // 可以使用一个非原子类型赋值, 但不能拷贝构造
6 std::thread::hardware_concurrency() std::async()
7 mutable const 成员函数不能修改 类的成员 , 用mubable修饰之后可更改