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完成它在做什么,并设置它变得更糟mylock回false,而线程B仍在执行.因此,即使线程B仍在那里,另一个线程也可以出现并锁定.
互斥锁保证原子性.也就是说,它保证了检查和更新一次只能由一个线程完成.因此,如果使用互斥锁替换布尔值,则:
if (mutex.Acquire())
{
// do stuff
// then release the lock
mutex.Release();
}
Run Code Online (Sandbox Code Playgroud)
两个线程不可能同时获取互斥锁.