【发布时间】:2014-04-29 15:19:13
【问题描述】:
问题:对同一个 unsigned int 变量执行按位操作(清除两个不同位位置)的两个线程正在创建竞争条件。 (它是一个标志变量)。
目前正在尝试解决方案:每次在设置或清除位位置之前使用互斥锁。
环境:Android 用户空间、仿生、C++
现在,我也想检查一下,我是否可以使用 android 的原子操作函数来避免竞争条件,
android_atomic_and/android_atomic_or 并将变量定义为 volatile unsigned int。
据我了解,这在逻辑上类似于atomic_set、atomic_and 等内核空间原子操作。
所以,如果有人可以解决我的疑问,或者是否有其他解决方案可以更好地解决此问题,请提供帮助。
【问题讨论】:
-
volatile不暗示原子性。除此之外,您似乎对解决方案有一些想法,尽管您可能会考虑是否可以简单地将两个标志分开到它们自己的变量/记忆词中。 -
@ChrisStratton,该变量中的每一位代表一个标志,因此该变量(例如 mFlags)将包含多达 32 个标志条件,并且线程将访问同一个 mFlag 变量以设置和清除相应的位位置更新状态。
-
鉴于您有多个线程,位图这些标志可能是一个糟糕的设计决策,除非您愿意使用互斥锁或某种本土同步设置器来保护它们。将它们分成 32 个字大小的变量可能会简单得多。
-
std::atomic en.cppreference.com/w/cpp/atomic/atomic
-
android_atomic_and/android_atomic_or应该做你想做的事。您不必将int变量声明为 volatile 即可使用这些函数。但是要读取变量的值,您可能需要使用android_atomic_release_load()之类的东西。
标签: android c++ c multithreading race-condition