为什么要使用互斥锁而不是布尔变量进行线程同步?

BSa*_*nke 9 multithreading synchronization mutex boolean

我正在尝试理解C中的多线程编程.

我怀疑当我们使用MUTEXES进行线程同步时,为什么我们不能使用布尔变量来阻止要执行的代码的关键区域.

布尔变量的静音特性是什么?

PS:实际上这个问题在接受采访时被问到了.所以请分享您对此的了解.

Jim*_*hel 10

问题是两个线程都可以同时看到布尔值,并且两者都会认为继续安全.

例如,假设您有以下代码:

bool myLock = false;  // visible to all threads

void someFunction()
{
    if (!myLock)
    {
        myLock = true;
        // do whatever
        // and then release the lock
        mylock = false;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,假设两个线程正在执行.线程A读取myLock并看到它false,因此它继续下一条指令.同时,线程B读取myLock并看到它false,因为线程A尚未将其设置为true.因此,线程B也会向前走并锁定.此时,两个线程都在执行应该由互斥锁保护的代码.

因为线程A完成它在做什么,并设置它变得更糟mylockfalse,而线程B仍在执行.因此,即使线程B仍在那里,另一个线程也可以出现并锁定.

互斥锁保证原子性.也就是说,它保证了检查和更新一次只能由一个线程完成.因此,如果使用互斥锁替换布尔值,则:

if (mutex.Acquire())
{
    // do stuff
    // then release the lock
    mutex.Release();
}
Run Code Online (Sandbox Code Playgroud)

两个线程不可能同时获取互斥锁.

  • 互斥锁本质上是原子的。它使用执行原子检查和更新的 CPU 指令。因此,如果一个线程开始获取互斥锁,另一个线程就不可能这样做。 (2认同)