关于.net:在C#中是bool读/写原子

关于.net:在C#中是bool读/写原子

Is a bool read/write atomic in C#

在C#中访问bool字段原子? 特别是,我需要锁定:

1
2
3
4
5
6
7
8
9
10
class Foo
{
   private bool _bar;

   //... in some function on any thread (or many threads)
   _bar = true;

   //... same for a read
   if (_bar) { ... }
}

是。

Reads and writes of the following data types are atomic: bool, char, byte, sbyte, short, ushort, uint, int, float, and reference types.

在C#语言规范中找到。

编辑:理解volatile关键字可能也值得。


如上所述bool是原子的,但你仍需要记住它还取决于你想用它做什么。

1
2
3
4
if(b == false)
{
    //do something
}

不是
原子操作意味着b值可以在当前线程在if语句之后执行代码之前改变。


bool访问确实是原子的,但这不是全部。

您不必担心读取"未完全编写"的值 - 在任何情况下都不清楚boo可能意味着什么 - 但您必须担心处理器缓存,至少在时机是一个问题。如果在核心A上运行的线程#1在缓存中具有_bar,并且_bar由在另一个核心上运行的线程#2更新,则线程#1将不会立即看到更改,除非您添加锁定,声明_barvolatile,或显式插入对Thread.MemoryBarrier()的调用以使缓存的值无效。


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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;
       }
     }
}

目标基本上是避免必须在每次迭代时重复锁定一个对象,只是为了检查我们是否需要锁定它以便提供很少发生的大量状态变化信息。我认为这种方法有效。如果需要绝对的一致性,我认为挥发性在b bool上是合适的。


推荐阅读

    linux访问网址命令?

    linux访问网址命令?,地址,网络,系统,手机,设备,信息,网址,命令,首次,管理,lin

    linux命令下访问页面?

    linux命令下访问页面?,系统,数据,传播,网址,环境,密码,信息,地址,软件,工作,l

    linux下抓取字段命令?

    linux下抓取字段命令?,数据,系统,命令,单位,报告,工具,字符串,文件,范本,样

    linux锁定帐户的命令?

    linux锁定帐户的命令?,系统,密码,情况,管理,工作,用户,帐户,账户,命令,权限,L

    linux访问网站的命令?

    linux访问网站的命令?,地址,系统,服务,工作,网站,命令,网络,管理,信息,网址,L

    linux提取字段串命令?

    linux提取字段串命令?,数字,字符串,状态,工具,命令,文件,范本,样式,正则,字

    linux访问模板命令?

    linux访问模板命令?,工作,地址,系统,信息,管理,命令,目录,发行,设备,文件,lin

    linux锁定终端命令?

    linux锁定终端命令?,工作,密码,地址,系统,信息,命令,图片,状态,目录,用户,lin

    命令访问linux系统?

    命令访问linux系统?,系统,地址,信息,软件,命令,时间,工具,网络,管理,电脑,lin

    linux命令行锁定界面?

    linux命令行锁定界面?,系统,管理,地址,密码,工作,一致,数字,首页,快捷键,界

    linux命令访问网页?

    linux命令访问网页?,地址,传播,网络,系统,软件,网址,密码,服务,数据,首次,lin

    linux访问日志的命令?

    linux访问日志的命令?,系统,信息,对比,实时,基础,日志,命令,文件,设备,管理,l

    linux网页访问命令?

    linux网页访问命令?,地址,网络,工作,系统,命令,传播,信息,软件,代码,首次,在L

    linux访问日志命令?

    linux访问日志命令?,系统,信息,对比,日志,简介,管理,情况,实时,命令,文件,查

    linux访问d盘命令?

    linux访问d盘命令?,系统,管理,电脑,设备,软件,概念,信息,分区,文件,命令,...6

    linux文件访问命令行?

    linux文件访问命令行?,系统,地址,工作,图片,命令,标准,名称,情况,官方网站,

    linux客户访问命令?

    linux客户访问命令?,网络,系统,地址,服务,管理,信息,数字,基础,密码,命令,Lin

    linux锁定密码命令?

    linux锁定密码命令?,密码,系统,管理,信息,策略,状态,名称,软件,位置,环境,如

    linux锁定用什么命令?

    linux锁定用什么命令?,地址,系统,认证,图片,名字,信息,状态,时间,命令,用户,L

    linux访问路径命令?

    linux访问路径命令?,工作,系统,名称,地址,信息,命令,工具,名字,目录,文件,在l