【发布时间】:2014-11-22 03:47:33
【问题描述】:
考虑这段代码:
int x; //declared globally
for( int i=0; i<1000000; i++)
x++;
printf("%d",x);
这是程序的核心逻辑,忽略创建线程等语法的东西。
现在,我创建了两个线程,并且程序在运行时表现出竞争条件(显然!)。
为简单起见,让我们假设整个 for 循环在一个线程中一次性运行,然后才运行第二个线程(假设是单处理器系统)。因此,理想的预期输出是第一个线程为 100 万,第二个问题为 200 万。 (虽然哪个线程打印 200 万取决于 CPU 调度程序)
我的第一个问题: 根据竞态条件的定义,我每次运行程序时,第一输出和第二输出都打乱了,是否可以认为是竞态条件?为什么?
第二个问题:考虑一个多处理系统,它在两个线程中同时运行 for 循环 100 万次。理想情况下的预期输出是多少?为什么?
【问题讨论】:
-
首先,“跳跃”输出不能归因于与该循环有关的任何事情。其次,正是由于您已经宣布的已知竞争条件,我希望 nothing 具有任何可预测性,即使输出没有“混乱”。所以我不确定这个问题的意义是什么。你已经确定这是一个有种族条件的节日,我们只能假设你知道那是什么,那么问题到底是什么?
-
即使有适当的程序也很难证明比赛条件。我看到大部分时间都在打印一些随机输出(这可以被认为是竞争条件)。但其他时候(很少),程序会打印
x=1000000和x=2000000(但不是每次都以相同的顺序)。所以我的问题是,当程序打印这些理想值时,它是否展示了竞争条件?模棱两可的是,虽然值是正确的,但顺序是错误的 -
由于竞态条件,很难预测会发生什么,无法提前确定。最好是您创建、测试代码,然后提出一个问题,为什么会发生这种情况,而不是为您预测输出并解释。
-
我不是要实际输出。理想情况下会是什么?考虑到每个微指令在两个处理器中彼此同步。现在输出会是什么?
-
是的。输出应该首先是
x=1000000,然后是x=2000000,对吗?有时会很混乱
标签: c multithreading multiprocessing race-condition