mutex

mutex

用于同步机制,不可复制,不可移动

lock & unlock

1
2
3
4
5
6
mutex m;
void (){
m.lock();

m.unlock();
}

如果do_something过程中有异常,则不能正常解锁,可能会造成死锁现象,改进方法是在每个抛出异常时调用unlock.

try_lock

尝试获取锁,立即返回,成功为true,失败false.

1
2
3
4
5
6
7
8
9
10
mutex m;
while(true){
if(m.try_lock()){
//do_something with share data
m.unlock();
}
else{
//do_something_else
}
}

time_mutex

lock & un_lock & try_lock

方法同mutex.

try_lock_for & try_lock_until

  • 尝试加锁,阻塞直到指定的timeout_duration或获得锁,成功返回true,失败false.
    timeout_duration小于等于timeout_duration.zero(),等同于try_lock().

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    time_mutex tm;
    using MS = chrono::milliseconds;
    while(true){
    if(tm.try_lock_for(MS(100))){
    //do_something_with_share_data
    tm.unlock();
    }
    else{
    //do_something_else
    }
    }
  • 尝试加锁,阻塞直到指定的timeout_time或获得锁,成功返回true,失败false.
    当前时间若已经过timeout_time,等同于try_lock().

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    time_mutex tm;
    using MS = chrono::seconds;
    while(true){
    auto NOW = chrono::steady_clock::now();
    if(tm.try_lock_until(NOW + MS(100))){
    //do_something_with_share_data
    tm.unlock();
    }
    else{
    //do_something_else
    }
    }

recursive_mutex & recursive_time_mutex

递归锁,暂时略过…

share_mutex & share_time_mutex

共享锁,暂时略过