如何保证多线程下比较结果仍然成立?

smw*_*dia 5 multithreading atomic

假设有3个线程,

线程 1 和 2 将原子地增加或减少全局变量 X。

线程 1:

atomic_increase(X)
Run Code Online (Sandbox Code Playgroud)

线程2:

atomic_decrease(X)
Run Code Online (Sandbox Code Playgroud)

线程 3 将检查 X 是否大于某个预定义值并执行相应操作。

线程 3:

if( X > 5 ) {... logic 1 ...}
else {... logic 2 ....}
Run Code Online (Sandbox Code Playgroud)

我认为atomic_xxx操作还不够。它们只能同步线程1和线程2之间的修改。

如果在线程 3 完成比较并进入 后,X被线程 1 或 2 改变怎么办? logic 1

修改或读取时是否必须使用互斥锁来同步所有 3 个线程X

添加1

顺便说一句,逻辑 1 和逻辑 2 不会修改 X。

mln*_*drv 2

简而言之,是的,读取也需要以某种方式同步,否则读取不一致的风险是真实存在的。读和写之间执行的读atomic_increase将会不一致。

然而,如果logic 1logic 2do stuff to X,你的问题似乎并不止于此。我认为那么你需要事务的概念,它以读取(X > 5事物)开始,然后以写入(logic 1logic 2)结束。