我正在尝试了解 C 中的多线程编程。
我有疑问,既然我们使用MUTEXES来进行线程同步,为什么我们不能使用布尔变量来阻塞要执行的代码的关键区域。
与布尔变量相比,静音变量有何特点?
PS:其实这个问题是在采访中问到的。
因此,请分享您对此的了解。
问题是两个线程可能同时看到布尔值可用,然后两个线程都会认为可以安全地继续。
例如,假设您有以下代码:
bool myLock = false; // visible to all threads
void someFunction()
{
if (!myLock)
{
myLock = true;
// do whatever
// and then release the lock
mylock = false;
}
}
现在,假设有两个线程正在执行。线程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();
}
两个线程不可能同时获取互斥锁。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)