Tag: 互锁

安全读取long 内容的最快方法,其元素同时更改

当你有一个 long[] myArray = new long[256]; 其项目由多个线程使用更改 Interlocked.Increment(ref myArray[x]) 肯定不可能在某个时间点获取myArray的快照,因为同时存在非锁定写入,所以我不是想要得到它。 那么我真的需要Volatile.Read的每一个元素来获取过去某个时刻的所有值的副本吗? long[] copy = new long[256]; for (int i = 0; i < 256; i++) copy[i] = Volatile.Read(ref myArray[i]); 由于我对某个时间点的快照不感兴趣,过时的值不是问题,但由于64位非易失性读取不是primefaces的,我担心以下可能会给我一个预增量的一半long,和后增量的一半,可能会给出一个从未存在于数组中的值。 long[] copy = new long[256]; for (int i = 0; i < 256; i++) copy[i] = myArray[i]; 那么Volatile.Read变种是正确的选择,因为我不想使用任何锁定?

Interlocked是否提供所有线程的可见性?

假设我有一个变量“counter”,并且有几个线程通过使用Interlocked访问和设置“counter”的值,即: int value = Interlocked.Increment(ref counter); 和 int value = Interlocked.Decrement(ref counter); 我可以假设,Interlocked所做的更改将在所有线程中可见吗? 如果没有,我该怎么做才能使所有线程同步变量? 编辑:有人建议我使用volatile。 但是当我将“计数器”设置为volatile时,会有编译器警告“对volatile字段的引用不会被视为volatile”。 当我阅读在线帮助时,它说:“通常不应使用ref或out参数传递易失性字段”。

C#互锁function作为锁机制?

当我读到有关ReaderWriterLockSlim锁定机制时, 有人提出Interlock Functions可用于更精细的锁定 另外,我在这里找到了 Marc的另一个答案: …写入对克隆副本进行更改,然后使用Interlocked.CompareExchange交换引用(如果另一个线程在临时中突变了引用,则重新应用它们的更改)。 好吧,目前我所知道的Interlocked对象,就是它(在multithreading环境中)用来做primefacesadditions , compare , compare , compareExchange操作。 (我知道如何使用它) 但是( 这是我的问题 ) – 题 我如何将其用作锁 ? (示例代码将非常感谢) 编辑 为简单起见,我粘贴了这段代码( 这不是线程安全的 – 如果同时由两个线程调用Go ,则可能会得到一个被零除错误 ): class ThreadUnsafe { static int _val1 = 1, _val2 = 1; static void Go() { if (_val2 != 0) Console.WriteLine (_val1 / _val2); _val2 = 0; […]

何时应该&不应该使用此C#实用程序类通过Interlocked控制线程

我正在努力理解这个类的编写背后的逻辑,以及何时应该而且不应该使用它。 任何见解将不胜感激 internal struct SpinLock { private volatile int lockHeld; private readonly static int processorCount; public bool IsHeld { get { return this.lockHeld != 0; } } static SpinLock() { SpinLock.processorCount = Environment.ProcessorCount; } public void Enter() { if (Interlocked.CompareExchange(ref this.lockHeld, 1, 0) != 0) { this.EnterSpin(); } } private void EnterSpin() { int num […]

Interlocked是否保证C#中其他线程的可见性,还是仍然需要使用volatile?

我一直在阅读类似问题的答案,但我仍然有点困惑……亚伯有一个很好的答案,但这是我不确定的部分: …声明变量volatile会使每次访问都变得不稳定。 不可能以任何其他方式强制执行此行为,因此不能用Interlocked替换volatile。 在其他库,接口或硬件可以访问您的变量并随时更新它或需要最新版本的情况下,这是必需的。 Interlocked是否保证对所有线程的primefaces操作的可见性,或者我是否仍然必须在值上使用volatile关键字以保证对更改的可见性? 这是我的例子: volatile int value = 100000; // 0) { // do something } } public void AThreadMethod() { while(value > 0) { // do something } } 更新: 我是一个糟糕的运动,我改变了原来的例子,所以这里又是: public class CountDownLatch { private volatile int m_remain; // <— do I need the volatile keyword here? private EventWaitHandle m_event; public […]

使用volatile关键字与使用Interlocked类相比有什么优势吗?

换句话说,我可以使用常规变量和Interlocked类无法解决的volatile变量吗?

什么是Interlocked.Increment实际上在做什么?

Interlocked.Increment似乎是在multithreading代码中需要执行的最标准/最简单的操作之一。 我假设该方法的function是一种排序模式,任何具有线程经验的人都能够复制。 所以基本上我想知道的是,如果有人可以提供Interlocked.Increment方法实际内部执行的完全重复(解释它是如何工作的)? (我已经找到了实际方法的来源但却无法找到它)

为什么每个人都说SpinLock更快?

我在互联网上阅读了很多文档,文章和post。 几乎每个人和每个地方都认为SpinLock对于短时间运行的代码来说速度更快,但我做了一个测试,在我看来,简单的Monitor.Enter比SpinLock.Enter运行得更快(Test是针对.NET 4.5编译的) using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Diagnostics; using System.Threading.Tasks; using System.Linq; using System.Globalization; using System.ComponentModel; using System.Threading; using System.Net.Sockets; using System.Net; class Program { static int _loopsCount = 1000000; static int _threadsCount = -1; static ProcessPriorityClass _processPriority = ProcessPriorityClass.RealTime; static ThreadPriority _threadPriority = ThreadPriority.Highest; static long _testingVar = 0; static void […]

可以锁定(等待)免费双向链表吗?

用C#标签提出这个问题,但是如果可能的话,应该可以使用任何语言。 是否可以使用Interlocked操作实现双向链表以提供无等待锁定? 我想插入,添加和删除,并清除,而不是等待。

读取由Interlocked在其他线程上更新的int

(这是重复: 如何正确读取Interlocked.Increment’ed int字段?但是,在阅读了答案和评论后,我仍然不确定正确的答案。) 有一些我不拥有的代码,并且无法更改为使用在几个不同线程中增加int计数器(numberOfUpdates)的锁。 所有来电均使用: Interlocked.Increment(ref numberOfUpdates); 我想在我的代码中读取numberOfUpdates。 既然这是一个int,我知道它不会撕裂。 但是,确保我获得最新价值的最佳方法是什么? 看起来我的选择是: int localNumberOfUpdates = Interlocked.CompareExchange(ref numberOfUpdates, 0, 0); 要么 int localNumberOfUpdates = Thread.VolatileRead(numberOfUpdates); 两者都可以工作(无论优化,重新排序,缓存等,都可以提供最新的价值)? 一个优先于另一个? 还有第三种选择更好吗?