以下构造是否是线程安全的,假设 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。
- 如果线程二在更新时看到 foo[i] 处于中间状态,那么只会发生两件事:中间状态是 <
SOME_OTHER_NUMBER
或者不是。如果是 <SOME_OTHER_NUMBER
,线程二也会尝试将其设置为 MAGIC_VAL。如果没有,线程二将什么也不做。
编辑:另外,如果 foo 是 long 或 double 什么的,那么更新它就不能自动完成?您仍然可以假设对齐等是这样的,即更新 foo 的一个元素不会影响任何其他元素。此外,在这种情况下,多线程的重点是性能,因此任何类型的锁定都会破坏这一点。