3

想象这样一种情况,其中多个线程可以在某个缓冲区上写入(对其大小没有限制)并且所有这些约束都适用:

  1. 在所有线程开始之前,缓冲区被初始化为零。
  2. 线程可以写入缓冲区,也可以不写入。
  3. 如果一个线程写入缓冲区,它会写入一定的字节串(我们称之为它VV不仅由零组成,而且对所有线程都是相同的)。
  4. 没有线程从缓冲区中读取。
  5. 一个线程在缓冲区上写入的事实,以及它在缓冲区上写入的内容,并不取决于其他线程是否已在缓冲区上写入的事实。
  6. 如果一个线程开始在缓冲区上写入,那么它将完全写入。
  7. 线程写入缓冲区而不遵循精确的字节顺序。

问题是:在所有线程都停止之后(如果它们开始写入缓冲区,这只会发生在它们已经完成写入缓冲区的情况下),我是否可以保证,在任何真实世界或至少合理的架构下,:

  1. 要么缓冲区包含全零,
  2. 或者缓冲区包含确切的内容V

如果没有,是否有任何一致的论点表明V'可以写入另一个字节字符串,称为它?V如果是这样,和之间可能有什么区别V'?为什么?

4

2 回答 2

1

数字 6 似乎是关键,它基本上表明对缓冲区的写入是原子的且不可中断的。因此内容要么是 0 要么是一致的v

当然,这不是线程的正常情况,除非您使用互斥锁之类的东西。

于 2013-05-16T21:48:50.097 回答
1

是的,这是有保证的(如果所有线程确实将相同的值写入相同的位置)。字节存储是原子的。这意味着系统不能“组成”任何值。缓冲区中每个字节的唯一可能值是零(因为它已预先初始化)或所有线程写入的值。

现在的问题是:零会以某种方式滑落吗?某个位置会以byte[]某种方式最终似乎从未被写入过吗?答案:没有。目前尚不清楚哪个写入通过,但它们都是相同的。如果至少有一个线程写入缓冲区,它将完全包含V. (如果没有人写过,它就会全为零。这是微不足道的。所以我假设至少有一个线程写入缓冲区)。

当然,您的阅读线程必须等待作者终止才能强制使用内存屏障。屏障保证所有以前的写入对读者都是可见的。

于 2013-05-16T21:49:42.180 回答