|
1
7
在回答你的问题之前,我应该指出内存障碍不仅仅影响CPU。当应用程序运行时,实际上有两个内存模型在运行。一个在硬件层,另一个在软件层。作为一名开发人员,您必须为这两种元素中最弱的组合编写代码。对于CLR和x86体系结构,这通常意味着CLR更重要,因为x86体系结构实际上具有相当强的内存模型。换句话说
首先,从技术上讲,volatile read不能确保读取变量的最新值。这实际上意味着在易失性读写之前,没有其他读写操作可以发生。但是,其结果是,读取必须来自主内存 如果 前面是另一个volatile read。其次,不,易失性读取对其他写入没有影响,因此它不会强制所有CPU刷新其写缓存。第三,是的,易失性操作被认为是内存障碍。
与volatile read类似,volatile write在技术上是关于排序的。它确保在易失性读写之后不会发生其他读写操作。这并不意味着所讨论的写操作会立即被提交。它只影响执行该线程的CPU。有趣的是,x86架构实际上处理 全部的 作为易失性写入。但是,CLR没有(至少是ECMA规范)。这就是为什么您仍然必须对写操作使用volatile操作的原因。这是从硬件和软件两个层面为最弱的内存模型元素编码的一个例子。
对。有两种类型的记忆障碍。全篱笆和半篱笆。半隔离可以获取语义(volatile read)或释放语义(volatile write),但不能同时获取语义和释放语义。满篱笆
是的。对于值得联锁的增量和减量操作,可以使用
CAS
行动。在.NET中,您将使用
它将影响所有内存访问,但仅限于执行该线程的CPU。
基本上是的。线程从不通过互锁操作阻塞。
如果不先释放锁,则不能在同一线程上获取两次锁。有更多关于 Joe Duffy's blog . |
|
|
2
1
锁的一个问题是,任何获取锁的线程都必须承担其他线程在任意时间段内持有锁的风险。保证Threading.Interlocked.CompareExchange调用几乎立即返回(无论是否成功);除非在故意激烈竞争的情况下,否则 短的 CompareExchange自旋锁也将快速返回。如果一个线程获取一个锁,然后在释放它之前离开并执行其他操作,那么其他线程将不得不等待这些其他操作完成,然后才能获取该锁。CabExchange自旋锁不存在这样的危险。除非其他线程主动命中spinlock本身,否则spinlock将很快完成。 |
|
|
user107586 · 如何处理等待句柄不会导致无限循环? 1 年前 |
|
|
ron burgundy · 获取-释放语义是否跨线程传递?[副本] 1 年前 |
|
|
BenjiFB · C#内存缓存:在一次操作中追加到列表? 1 年前 |
|
|
András Takács · Python多线程问题 1 年前 |
|
|
András Takács · Python多线程错误 1 年前 |