我搜索了一下,但找不到任何有用的东西。有人可以帮我解决这个并发/同步问题吗?
假设以下程序的五个实例异步运行,
s
是一个初始值为0
且i
为局部变量的共享数据,这些值可由{{获得1}}?
s
我想知道哪些值,以及原因。
答案 0 :(得分:1)
不回答的答案是:Uaaaa,不要做这样的事情。
在您的问题意义上的答案更多:原则上,任何值都是可能的,因为它完全未定义。您没有严格保证并发写入以任何方式是原子的,并且不会导致完全垃圾 实际上,机器字大小的写入是原子无处不在(据我所知,至少),但它们没有定义的顺序。此外,您通常不知道调度线程/进程的顺序。所以你永远不会看到“随机垃圾”价值,但你也不知道它会是什么。它将是5或更高(最多25)。
由于没有使用原子增量,因此在读取值,递增值和将其写回之间存在竞争。如果在写回结果之前由另一个实例写入该值,则先前完成的写入(以及增量)无效。如果没有发生,两个增量都有效。
尽管如此,每个实例至少将该值递增5次,因此除了理论上的“总垃圾”可能性之外,小于5的值不可能导致结束。因此,(1)和(2)是不可能的,但是(3)是。