对共享数据的并发/异步访问

时间:2012-01-19 08:32:35

标签: concurrency synchronization

我搜索了一下,但找不到任何有用的东西。有人可以帮我解决这个并发/同步问题吗?

  

假设以下程序的五个实例异步运行,s是一个初始值为0i为局部变量的共享数据,这些值可由{{获得1}}?

s
  1. 2
  2. 1
  3. 6
  4. 我想知道哪些值,以及原因。

1 个答案:

答案 0 :(得分:1)

不回答的答案是:Uaaaa,不要做这样的事情。

在您的问题意义上的答案更多:原则上,任何值都是可能的,因为它完全未定义。您没有严格保证并发写入以任何方式是原子的,并且不会导致完全垃圾 实际上,机器字大小的写入是原子无处不在(据我所知,至少),但它们没有定义的顺序。此外,您通常不知道调度线程/进程的顺序。所以你永远不会看到“随机垃圾”价值,但你也不知道它会是什么。它将是5或更高(最多25)。

由于没有使用原子增量,因此在读取值,递增值和将其写回之间存在竞争。如果在写回结果之前由另一个实例写入该值,则先前完成的写入(以及增量)无效。如果没有发生,两个增量都有效。

尽管如此,每个实例至少将该值递增5次,因此除了理论上的“总垃圾”可能性之外,小于5的值不可能导致结束。因此,(1)和(2)是不可能的,但是(3)是。