有一个article about semaphores on OS X。作者通过在两个线程中递增和递减静态变量来测试信号量。通过信号量保护变量访问,变量最终为零。如果没有后卫,变量最终会有一些虚假的价值。我尝试了代码,它的工作原理。我不明白的是,两个线程的并发访问如何在最终变量值中产生差异。毕竟在我看来,像一堆+ 1s和-1s应该是可以交换的,对吧?我觉得我错过了一些明显的东西,它是什么? :)
答案 0 :(得分:4)
问题是++
/ --
不是原子的。它们基本上是三个操作:
因此,如果两个线程同时加载值并同时存储它。差异将是1而不是2。
这是样本
Thread A Thread B
Load 5 Load 5
Inc 6 Inc 6
Store 6 Store 6