如何在此条件中使用lock_guard

时间:2016-07-25 17:11:13

标签: c++ multithreading

线程具有以下控制流程:

mutex.lock()
if (condition) {
    // do synced things
    mutex.unlock();
    // do parallel things
} else {
    // do other synced things
    mutex.unlock();
    // do other parallel things
}

注意四个do部分如何执行不同的事情。

如何将锁定和解锁的直接呼叫替换为使用std::lock_guard

2 个答案:

答案 0 :(得分:5)

std::unique_lock看起来就像你在寻找什么。语义类似于std::lock_guard,但allows more sophisticated constructs。因此,在您的情况下,您仍然可以获得异常安全性,但也可以提前明确解锁。类似的东西:

std::unique_lock<decltype(mutex)> guard(mutex); // calls mutex.lock() like lock_guard
if (condition) {
    // do synced things
    guard.unlock();
    // do parallel things
} else {
    // do other synced things
    guard.unlock();
    // do other parallel things
}
// unlocks on leaving scope, if held similar to lock_guard

答案 1 :(得分:1)

bool cond;
{
    std::lock_guard<std::mutex> lg(mutex);
    cond = global_condition;
    if (cond){
        // do some synced stuff
    } else {
        // do the other synced stuff
    }
}

if (cond){
    // do parallel stuff
} else {
    // do the other parallel stuff
}

由于两个案例中的并行内容都是在解锁保护全局条件的互斥锁之后完成的,这意味着条件要么不能改变,要么我们不关心它是否发生变化。因此,我们可以稍后根据保存的值再次保存值和if-else。