C++11多线程

来源:互联网 发布:淘宝男装代理一手货源 编辑:程序博客网 时间:2024/06/03 17:05

一点笔记,后续展开。


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


0 0
原创粉丝点击