Ruc*_*tel 5 c concurrency multithreading operating-system
假设两个线程并发执行以下 C 代码,访问共享变量 a、b 和 c:
初始化
int a = 4;
int b = 0;
int c = 0;
Run Code Online (Sandbox Code Playgroud)
主题 1:
if (a < 0) {
c = b - a;
} else {
c = b + a;
}
Run Code Online (Sandbox Code Playgroud)
主题 2:
b = 10;
a = -3
Run Code Online (Sandbox Code Playgroud)
c两个线程完成后可能的值是什么?您可以假设变量的读取和写入是原子的,并且每个线程内的语句顺序都保留在 C 编译器生成的代码中。
答案:4,7,14,13,-3
我理解前四个输出如下,但我无法理解输出 -3 是如何发生的,因为线程中的语句顺序被保留。
4:执行完线程1,再执行线程2。
7:先中断线程1 c = b + a,再执行线程2,再执行线程1。
14:执行线程2直到b = 10完成,然后中断它,并完全执行线程1。
13:完全执行线程2,然后执行线程1。
现在我被困在如何获得 -3 作为 的最终值c?-3 仅在b=0、 和时可用a=-3,并且线程 1 从 开始执行c = b + a。我认为 -3 在任何其他情况下都不可能。但是正如前面提到的,语句的顺序是保持的,所以 a 的值不能为 -3,除非我们将 b 的值更改为 10。
有人可以解释在这种情况下如何输出 -3 吗?
你可以得到-3如下:
a < 0,这是错误的。这将带您进入 else 条件。读取 的值b,即0。a现在是-3。a,即-3。然后,添加并分配-3给c.| 归档时间: |
|
| 查看次数: |
1029 次 |
| 最近记录: |