gpt4 book ai didi

multithreading - 为什么使用互斥体而不是 boolean 变量进行线程同步?

转载 作者:行者123 更新时间:2023-12-04 06:33:52 25 4
gpt4 key购买 nike

我试图理解 C 中的多线程编程。

我怀疑既然我们使用 MUTEXES 进行线程同步,为什么我们不能使用 boolean 变量来阻止要执行的代码的关键区域。

boolean 变量静音的特点是什么?

PS:其实这个问题是在面试的时候问的。
因此,请分享您对这方面的知识。

最佳答案

问题是两个线程可以同时看到 boolean 值可用,然后两者都假设继续是安全的。

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

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 仍在那里,另一个线程也可以出现并获取锁。

互斥锁保证原子性。也就是说,它保证检查和更新一次只能由一个线程完成。所以如果你用互斥锁替换 boolean 值,你有:
if (mutex.Acquire())
{
// do stuff
// then release the lock
mutex.Release();
}

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

关于multithreading - 为什么使用互斥体而不是 boolean 变量进行线程同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19534072/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com