Tag: 并发修改

多个线程访问一个变量

我在正在阅读的教科书中发现了这个问题。 解决方案也在下面给出。 我无法理解最小值是多少2.为什么线程不能读取0,所有其他线程都执行并写入1? 无论是1还是2,最后编写的线程还必须完成自己的循环? int n = 0; int main(int argc, char **argv) { for (i = 0; i < 5; i++) { int tmp = n; tmp = tmp + 1; n = tmp; } return 0; } 如果单个线程运行此应用程序,您可能希望最终输出为5.如果5个线程并行运行相同的循环,该怎么办? n可能具有的最大值和最小值是多少? 最大的应该是selfevident:25,从5个线程增加5个。 然而,关于最小可能值的推理更加困难。 提示:n可以小于5,但是由你决定原因。 解: 有五个线程运行这个五次迭代循环并且没有并发访问的保护,n可以达到的最低值是两个。 从最终结果向后工作时,了解如何达到此结果是最简单的。 对于最终输出为2,线程必须从n读取值1,递增它,然后写入2。 这意味着另一个线程写了一个,暗示它最初也读为零(这也是n的起始值)。 这解释了五个线程中的两个线程的行为。 但是,要发生此行为,必须覆盖其他三个线程的结果。 两个有效的执行可以实现这一点。 要么1)所有三个线程开始并在第一个线程读取零和写入一个之间完成执行,或者2)所有三个线程开始并在最终线程读取一个和写入两个之间完成执行。 两个执行顺序都有效。