gpt4 book ai didi

c++ - 我需要一个互斥锁来阅读吗?

转载 作者:IT老高 更新时间:2023-10-28 12:31:18 25 4
gpt4 key购买 nike

我有一个类,它有一个状态(一个简单的枚举),可以从两个线程访问。为了改变状态,我使用互斥锁(boost::mutex)。检查状态是否安全(例如比较 state_ == ESTABLISHED)还是在这种情况下我也必须使用互斥锁?换句话说,当我只想读取一个可以由另一个线程同时写入的变量时,我是否需要互斥锁?

最佳答案

视情况而定。

C++ 语言没有提及线程或原子性。

但在大多数现代 CPU 上,读取整数是一种原子操作,这意味着即使没有互斥体,您也将始终读取一致的值。

然而,如果没有互斥体或其他形式的同步,编译器和 CPU 可以自由地重新排序读取和写入,所以任何更复杂的东西,任何涉及访问多个变量的东西,在一般情况。

假设写入线程更新了一些数据,然后设置一个整数标志来通知其他线程数据可用,这可以重新排序,以便在更新数据之前设置标志。除非您使用互斥锁或其他形式的内存屏障。

因此,如果您想要正确的行为,则不需要互斥体,如果另一个线程在您读取变量时写入该变量也没问题。除非你在一个非常不寻常的 CPU 上工作,否则它将是原子的。但是您确实需要某种内存屏障来防止在编译器或 CPU 中重新排序。

关于c++ - 我需要一个互斥锁来阅读吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1525189/

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