并发排除调优

时间:2015-09-27 07:52:26

标签: c++ multithreading concurrency

void method1() {
    if (is_true) {
        mutex1.lock();
        condition_var.wait(mutex1,
                              [=] { return is_true == false; });
        mutex1.unlock();
    }
    // do some work
}


void method2() {
    if (is_true) {
        mutex1.lock();
        condition_var.wait(mutex1,
                              [=] { return is_true == false; });
        mutex1.unlock();
    }
    // do some work
}

void method3() {
    mutex2.lock();
    is_true = true;
    // do some job
    mutex1.lock();
    is_true = false;
    condition_var.notify_all();
    mutex1.unlock();
    mutex2.unlock();
}

method1method2可以同时执行,不需要进行任何自我同步,method3可以与mutex2同步。对于此method1method2 / method3无法与condition_var同时运行,并且使用is_true布尔值以及mutex1。 我关注的是mutex1创建了一个代码区域,其中method1method2被阻止其并发行为。但我无法删除此互斥锁,因为is_true = false; condition_var.notify_all();必须是原子操作。 如何重新设计它以从method1method2移除锁定?

1 个答案:

答案 0 :(得分:1)

您的代码没有问题。条件变量实际上没有状态。如果您在notify之前致电wait,它将无限期等待。因此,您必须手动实现状态is_true并使用互斥锁来防止竞争条件。

您还可以使用事件对象(Windows的CreateEvent,Linux的信号量),但效率会降低。 std::mutex的实现使用快速自旋锁,并且仅在自旋锁超时后才进行慢速系统调用。代码的保护部分很短,因此锁定不会影响性能。