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
2
3
4
5
6
7
std::mutex mtx; 
// ......
{
mtx.lock();
std::lock_guard<std::mutex> lck (mtx, std::adopt_lock)
}
// ......

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支持锁定持续时间或者锁定直至时间点

image-20260412191928407

lock

函数模板,可以⽀持对多个锁对象同时锁定,如果其中一个锁对象没有锁住,lock函数会把已经锁定的对象解锁而进入阻塞,直到锁定所有的所有的对象。

try_lock

也是⼀个函数模板,尝试对多个锁对象进⾏同时尝试锁定,如果全部锁对象都锁定了,返回-1,如果某⼀个锁对象尝试锁定失败,把已经锁定成功的锁对象解锁,返回未锁定对象的索引

我们可以注意到,几乎所有的锁对象,都不支持拷贝构造,赋值重载,只会支持移动构造或者移动赋值