以下构造是线程安全的,假设foo的元素已对齐并且大小正确,从而不会出现字词撕裂?如果不是,为什么不呢?将变量同时更新为同一值的线程安全
注意:下面的代码是我想要做的玩具例子,而不是我真实的现实情景。显然,在我的例子中,有更好的方式来编码可观察行为。
uint[] foo;
// Fill foo with data.
// In thread one:
for(uint i = 0; i < foo.length; i++) {
if(foo[i] < SOME_NUMBER) {
foo[i] = MAGIC_VAL;
}
}
// In thread two:
for(uint i = 0; i < foo.length; i++) {
if(foo[i] < SOME_OTHER_NUMBER) {
foo[i] = MAGIC_VAL;
}
}
这显然乍看上去不安全,所以我还是要强调,为什么我认为这可能是安全的:
- 只有两个选项是FOO的元素将保持不变或将设置为MAGIC_VAL。
- 如果线程2在更新中看到foo [i]处于中间状态,则只会发生两件事:中间状态为<
SOME_OTHER_NUMBER
或不是。如果它是<SOME_OTHER_NUMBER
,则线程2也会尝试将其设置为MAGIC_VAL。如果不是,线程2将不会执行任何操作。
编辑:另外,如果foo是一个长或双或什么,以便更新它不能做原子?你可能仍然认为对齐等是更新foo的一个元素不会影响任何其他元素的。此外,在这种情况下,多线程的全部重点都是性能,所以任何类型的锁定都会打败它。
是的,对于这样一个简单的for循环来说,在两个线程中执行它可能比仅仅执行一个循环慢,因为它们共享数据并且(尤其是不好的)写入它。负面可扩展性的万岁! – 2009-01-15 22:38:13