dan*_*gph 20 c# multithreading properties atomic
在C#中读取和写入某些基本类型,例如bool并且int是原子的.
(参见C#语言规范第5.5节"5.5变量引用的原子性")
但是通过属性访问这些变量呢?假设它们也是原子和线程安全的是否合理?例如,读取MyProperty下面的原子和线程安全?:
public bool MyProperty { get { return _foo; } }
Run Code Online (Sandbox Code Playgroud)
那么自动实现的属性呢?
public bool MyProperty { get; }
Run Code Online (Sandbox Code Playgroud)
Jon*_*eet 29
您需要更密切地区分"原子"和"线程安全".正如您所说,对于大多数内置值类型和引用,写入都是原子的.
但是,这并不意味着它们是线程安全的.它只是意味着如果写入"A"和"B"值,线程将永远不会看到它们之间的某些东西.(例如,从1到4的变化永远不会显示5或2,或者除1或4之外的任何值.)这并不意味着一个线程一旦被写入变量就会看到值"B".为此,您需要根据波动率来查看内存模型.在没有通常通过锁定和/或易失性变量获得的存储器障碍的情况下,可以延迟对主存储器的写入并且可以提前读取,实际上假设自上次读取以来该值没有改变.
如果你有一个计数器并且你问它的最新值但由于缺乏内存障碍而从未收到最新值,我认为即使每个操作都可能是原子的,你也不能合理地称之为线程安全.
这与属性无关 - 但是 - 属性只是围绕它们的语法糖的方法.它们不会对线程提供额外的保证..NET 2.0内存模型确实比ECMA模型具有更多的保证,并且它可以保证方法进入和退出.这些保证也应适用于物业,虽然我对这些规则的解释感到紧张:有时候很难推断出记忆模型.
| 归档时间: |
|
| 查看次数: |
4514 次 |
| 最近记录: |