【问题标题】:How is it possible for some threads to never execute?某些线程怎么可能永远不会执行?
【发布时间】:2016-03-22 18:16:03
【问题描述】:
int x = 0 // global shared variable
T1: for (i=0; i++; i<100) x++;
T2: x++ // no loop, just one increment

T1 和 T2 是独立的线程。我被告知 x 的最终值可以是 1 和 101 中的任何值。这怎么可能?我想知道这怎么可能只是 1。

显然,执行顺序中出现了一些错误,但我想知道是什么。

【问题讨论】:

  • 是什么语言?
  • 假设任意语言

标签: multithreading operating-system


【解决方案1】:

x++ is not atomic operation(至少在大多数语言中),这个操作实际上是这样工作的:

tmp = x;
tmp = tmp + 1;
x = tmp;

现在假设下一个执行顺序:

T2: tmp = x; // tmp is 0
T1: run all loop iterations, finally x is 100
T2: tmp = tmp+1; x = tmp; // x is 1

要获得任何其他数字,请想象下一个订单:

T1: started loop, at some point x is 45
T2: tmp = x; // tmp is 45
T1: finished loop, x is 100
T2: tmp = tmp+1; x = tmp; // x is 46

【讨论】:

  • 谢谢!那么,怎么可能以某个数字结束,比如 46?
  • 非常感谢,不胜感激!
【解决方案2】:

这种行为的原因是内存缓存。由于线程可以在独立的cpu上执行,因此可能出现以下情况:

T1:加载 x 值
T2:加载 x 值
T1:循环运行 10 次 (T1_x=10)
T2:增量 (T2_x=1)
T1:将值 10 保存到内存
T2:将值 1 保存到内存

这就是你需要线程同步的原因。你可以在这里阅读更多:Mutex example / tutorial?

感谢@Lashane 的更正。

【讨论】:

  • 什么是内存缓存?
  • CPU 有一个非常快的内置内存,称为缓存。 PC 中使用的每个现代 CPU 都有它。以Intel web page 为例。你可以在这里找到更多信息en.wikipedia.org/wiki/CPU_cache
  • 你想说 - 对于没有缓存的 CPU - 我们将无法获得 1?
  • 在回答之前请阅读how cpu cache actually works 以及为什么这里不是这种情况
  • 即使对于单个 cpu - 1 结尾的情况也是可能的
猜你喜欢
  • 1970-01-01
  • 2016-10-25
  • 2021-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-18
  • 1970-01-01
  • 2019-12-07
相关资源
最近更新 更多