C++11并发支持库
主要介绍一下常用的类或者函数接口
< thread >
std::thread 线程类,用于启动一个线程,不支持拷贝构造,不支持赋值拷贝,支持移动构造,移动赋值
std::this_thread 命名空间
- get_id Get thread id (function )
- yield Yield to other threads (function )
- sleep_until Sleep until time point (function )
- sleep_for Sleep for time span (function )
< mutex >
std::mutex 封装互斥锁的类,可调用lock、unlock进行加锁解锁
std::recursive_mutex 支持一个线程多次加锁(递归场景)
std::timed_mutex 额外提供try_lock_for和try_lock_untile接口,这两个接口跟try_lock类似,只是他不会马上返回,而是直接进入阻塞,直到时间条件到了或者解锁了就会唤醒试图获取锁资源
std::lock_guard C++11提供的⽀持RAII⽅式管理互斥锁资源的类,在构造时加锁,析构时解锁。另外可以在构造时传入std::adopt_lock管理已经加锁的mutex对象
1 | std::mutex mtx; |
std::unique_lock lock_guard的进阶版,提供更多的接口;unique_lock在构造的时候传不同的tag,⽤以支持在构造的时候不同的方式处理锁对象
try_to_lock:该对象管理m,并通过调用将其锁定(不阻塞)。锁定失败无返回值,可通过对象本身重载的
operator bool判断。m.try_lock()defer_lock:管理传入的互斥锁对象 ,但不对其进行锁定。且传入的互斥锁当前未被构造线程锁定。
adopt_lock:管理传入的m,并且当前已经被构造线程锁定
**unique_lock **还支持构造时传入
const chrono::duration<Rep,Period>& rel_time或者const chrono::time_point<Clock,Duration>& abs_time支持锁定持续时间或者锁定直至时间点

lock
函数模板,可以⽀持对多个锁对象同时锁定,如果其中一个锁对象没有锁住,lock函数会把已经锁定的对象解锁而进入阻塞,直到锁定所有的所有的对象。
try_lock
也是⼀个函数模板,尝试对多个锁对象进⾏同时尝试锁定,如果全部锁对象都锁定了,返回-1,如果某⼀个锁对象尝试锁定失败,把已经锁定成功的锁对象解锁,返回未锁定对象的索引
我们可以注意到,几乎所有的锁对象,都不支持拷贝构造,赋值重载,只会支持移动构造或者移动赋值