我很困惑这个问题 - 读/切换布尔值是否线程安全。C#和线程安全的bool
// case one, nothing
private bool v1;
public bool V1 { get { return v1; } set { v1 = value; } }
// case two, with Interlocked on set
private int v2;
public int V2 { get { return v2; } set { Interlocked.Exchange(ref v2, value); } }
// case three, with lock on set
private object fieldLock = new object();
private bool v3;
public bool V3 { get { return v3; } set { lock (fieldLock) v3 = value; } }
他们都是线程安全的吗?
编辑
从我读(click)布尔的原子并不保证它是线程安全的。请问volatile
型的帮助?
这些都不是线程安全的。调用getter的线程将始终读取陈旧值。它有多陈旧取决于处理器和优化器。从几纳秒到无穷大。吸气剂也需要同步。或者你可以使用ManualResetEvent/Slim。 – 2015-04-02 12:26:51
@ Ksv3n * Assignement总是一个原子操作*假,32位程序的“长”(64位)分配不是原子的。 – xanatos 2015-04-02 13:00:24
@HansPassant一个getter可以读取一个旧值,这是可以理解的。但是,它怎么会持续到无穷?使用锁将使它读取*正确*值 - 重读它,就好像它是不稳定的?我不认为它是这样工作的,我对你说的话感到困惑。我认为一旦没有人在写东西,吸气剂就会正常工作。 – 2015-04-02 13:40:58