dbk*_*bkk 77 .net c# concurrency boolean locking
在C#中访问bool字段原子?特别是,我需要锁定:
class Foo
{
private bool _bar;
//... in some function on any thread (or many threads)
_bar = true;
//... same for a read
if (_bar) { ... }
}
Run Code Online (Sandbox Code Playgroud)
Lar*_*nal 109
是.
以下数据类型的读取和写入是原子的:bool,char,byte,sbyte,short,ushort,uint,int,float和reference类型.
编辑:理解volatile关键字可能也值得.
Dro*_*per 47
如上所述bool是原子的,但你仍需要记住它还取决于你想用它做什么.
if(b == false)
{
//do something
}
Run Code Online (Sandbox Code Playgroud)
不是原子操作意味着在当前线程在if语句之后执行代码之前b值可能会发生变化.
McK*_*eG1 27
bool访问确实是原子的,但这不是全部.
您不必担心读取"未完全写入"的值 - 在任何情况下都不清楚boo可能意味着什么 - 但您必须担心处理器缓存,至少在时机是一个问题.如果在核心A上运行的线程#1具有您_bar的缓存,并且_bar由在另一个核心上运行的线程#2更新,则线程#1将不会立即看到更改,除非您添加锁定,声明_bar为volatile或显式插入调用以Thread.MemoryBarrier()使其无效缓存的价值.