在C#中是一个bool读/写primefaces

在C#中访问布尔字段primefaces? 特别是,我需要locking:

class Foo { private bool _bar; //... in some function on any thread (or many threads) _bar = true; //... same for a read if (_bar) { ... } } 

是。

以下数据types的读写是primefaces的:bool,char,byte,sbyte,short,ushort,uint,int,float和referencetypes。

如C#语言规范中所示 。

编辑:这可能也是值得了解volatile关键字。

如上所述,布尔是primefaces,但你仍然需要记住,这也取决于你想要做什么。

 if(b == false) { //do something } 

不是primefaces操作,这意味着在当前线程执行if语句之后的代码之前b值可能会改变。

布尔访问确实是primefaces,但这不是全部。

你不必担心读取的是“不完整的”值 – 不pipe怎么说,在任何情况下,这可能意味着什么 – 但是你不得不担心处理器caching,至less如果细节时机是一个问题。 如果在核心A上运行的线程#1的caching中有_bar ,并且_bar被在另一个核心上运行的线程#2更新,则线程#1将不会立即看到更改,除非您添加locking,将_barvolatile或显式插入调用Thread.MemoryBarrier()使caching的值无效。

我用过的方法,我认为是正确的

 volatile bool b = false; .. rarely signal an update with a large state change... lock b_lock { b = true; //other; } ... another thread ... if(b) { lock b_lock { if(b) { //other stuff b = false; } } } 

目的基本上是为了避免在每一次迭代中重复地locking一个对象,只是为了检查是否需要locking它,以便提供很less发生的大量状态改变信息。 我认为这种方法是有效的。 如果需要绝对的一致性,我认为波动是适当的。