0
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();
}
method1
和method2
可以同時執行,不需要有任何的自我同步,同步method3
本身mutex2
。 method1
/method2
無法與method3
同時運行此condition_var
和is_true
使用布爾值以及mutex1
。 我在這裏關心的是mutex1
創建了一個代碼區,其中method1
和method2
被阻止其併發行爲。但我無法刪除此互斥鎖,因爲is_true = false; condition_var.notify_all();
必須是原子操作。 如何重新設計它以從method1
和method2
中刪除鎖定?併發排除調整
實際上,無處可以保證'std :: mutex'通過_futex_實現。所以'std :: mutex :: lock()'只有在被鎖定時纔會很昂貴(因爲阻塞)。 – Nevermore