std::mutex、std::time_mutex、std::shared_mutex、std::shared_timed_mutex对比
参考【c++多线程(十九) - std::timed_mutex】
std::mutex
mutex
提供基本互斥设施。通常不直接使用std::mutex
。‘
当mutex
获取锁失败时,线程会一直阻塞。
锁定:
lock
: 锁定互斥,若互斥不可用则阻塞;try_lock
: 尝试锁定互斥,若互斥不可用则返回;unlock
: 解锁互斥。
mutex获取和释放锁如下:
mutex myMutex;
myMutex.lock();
//业务代码
myMutex.unlock();
std::timed_mutex
timed_mutex
提供互斥设置,实现有时限锁定。
timed_mutex带超时功能。在规定的等待时间内,没有获取锁,线程不会一直阻塞,代码会继续执行。
锁定:
lock
: 锁定互斥,若互斥不可用则阻塞;try_lock
: 尝试锁定互斥,若互斥不可用则返回;try_lock_for
: 尝试锁定互斥,若互斥在指定的时限时期中不可用则返回;try_lock_until
: 尝试锁定互斥,若直至抵达指定时间点互斥不可用则返回;unlock
: 解锁互斥。
timed_mutex
获取和释放锁如下:
timed_mutex myMutex;
chrono::milliseconds timeout(100); //100毫秒
if (myMutex.try_lock_for(timeout))
{
//在100毫秒内获取了锁
//业务代码
myMutex.unlock(); //释放锁
}
else
{
//在100毫秒内没有获取锁
//业务代码
}
std::shared_mutex
shared_mutex
提供共享互斥设施。
shared_mutex 类是一个同步原语,可用于保护共享数据不被多个线程同时访问。与便于独占访问的其他互斥类型不同,shared_mutex 拥有二个访问级别:
- 共享 - 多个线程能共享同一互斥的所有权。
- 独占性 - 仅一个线程能占有互斥。
若一个线程已获取独占性锁(通过 lock 、 try_lock ),则无其他线程能获取该锁(包括共享的)。
仅当任何线程均未获取独占性锁时,共享锁能被多个线程获取(通过 lock_shared 、 try_lock_shared )。
在一个线程内,同一时刻只能获取一个锁(共享或独占性)。
共享互斥体在能由任何数量的线程同时读共享数据,但一个线程只能在无其他线程同时读写时写同一数据时特别有用。
排他性锁定:
lock
: 锁定互斥,若互斥不可用则阻塞;
try_lock
:尝试锁定互斥,若互斥不可用则返回;
unlock
:解锁互斥;
共享锁定:
lock_shared
:为共享所有权锁定互斥,若互斥不可用则阻塞;
try_lock_sharedl
:尝试为共享所有权锁定互斥,若互斥不可用则返回;
unlock_shared
:解锁互斥(共享所有权);
std::shared_timed_mutex
shared_timed_mutex
提供共享互斥设施并实现有时限锁定。
shared_timed_mutex 类是能用于保护数据免受多个线程同时访问的同步原语。与其他促进排他性访问的互斥类型相反,拥有二个层次的访问:
- 共享 - 多个线程能共享同一互斥的所有权。
- 排他性 - 仅一个线程能占有互斥。
共享互斥通常用于多个读线程能同时访问同一资源而不导致数据竞争,但只有一个写线程能访问的情形。
排他性锁定:
lock
: 锁定互斥,若互斥不可用则阻塞;
try_lock
:尝试锁定互斥,若互斥不可用则返回;
unlock
:解锁互斥;
try_lock_for
: 常试锁定互斥,若互斥在指定的时限时期中不可用则返回;
try_lock_until
: 尝试锁定互斥,若直至抵达指定时间点互斥不可用则返回;
共享锁定:
lock_shared
:为共享所有权锁定互斥,若互斥不可用则阻塞;
try_lock_sharedl
:尝试为共享所有权锁定互斥,若互斥不可用则返回;
try_lock_for
: 尝试为共享所有权锁定互斥,若互斥在指定的时限时期中不可用则返回;
try_lock_until
: 尝试为共享所有权锁定互斥,若直至抵达指定时间点互斥不可用则返回;
unlock_shared
:解锁互斥(共享所有权);
std::shared_mutex和std::mutex的性能对比
参考【std::shared_mutex和std::mutex的性能对比(banchmark)】
- shared_mutex的适用场景比较特殊:一个或多个读线程同时读取共享资源,且只有一个写线程来修改这个资源,这种情况下才能从shared_mutex获取性能优势。
- 在多个只读线程和一个写线程的情况下,shared_mutex比mutex快一倍。