interlocked相关内容
TL;DR:我需要与C11的atomic_load相当的Microsoft C(而不是C++)。有人知道什么是正确的功能吗? 我有一些使用原子的非常标准的代码。类似于 do { bar = atomic_load(&foo); baz = some_stuff(bar); } while (!atomic_compare_exchange_weak(&foo, &bar, ba
..
InterlockedCompareExchangeRelease()和InterlockedCompareExchangeAcquire()有什么区别? 当我尝试使用 WIN32 API 学习同步函数时,我发现有两个函数名称不同但似乎做同样的事情: LONG __cdecl InterlockedCompareExchangeRelease(__inout LONG volatile *
..
我尝试使用 Parallel.For() 计算列表的平均值.我决定反对它,因为它比简单的串行版本慢四倍.然而,我对它产生的结果与串行结果不同这一事实很感兴趣,我认为了解原因会很有启发性. 我的代码是: public static double Mean(this IList list){双和 = 0.0;Parallel.For(0, list.Count, i => {双初始总和;双增量
..
假设一个类有一个被多个线程访问的public int counter 字段.这个 int 只会增加或减少. 要增加这个字段,应该使用哪种方法,为什么? lock(this.locker) this.counter++;, Interlocked.Increment(ref this.counter);, 将counter的访问修饰符改为public volatile. 现在我
..
Microsoft 提供了 InterlockedCompareExchange 用于执行原子比较和交换操作的函数.还有一个 _InterlockedCompareExchange 内在. 在 x86 上,这些是使用 lock cmpxchg 指令实现的. 然而,通读关于这三种方法的文档,他们似乎在对齐要求上不一致. 英特尔的参考手册 没有提及对齐(除了那如果对齐检查已启用并且进
..
是否有使用 Interlocked 类的巧妙方法来做到这一点?或者我应该只使用 lock { } 吗? 我的具体用例是我有多个线程来计算 long 值,并将其与共享的“最大值"值进行比较,仅当本地值较大时才替换共享值. 解决方案 试试 Interlocked.CompareExchange 方法.我没试过,但这样的事情对我来说似乎合乎逻辑: long localMax = Inte
..
假设我们有一个这样的类: 公共类Foo{私人酒吧酒吧=新酒吧();公共无效 DoStuffInThread1(){var old = Interlocked.Exchange(ref bar,new Bar());//做旧的事情//这里一切正常,我确定我有之前的 bar 值}public void OtherStuffFromThread2(){//我如何确保这里有最新的 bar ref//考虑
..
如果许多线程与以下代码同时调用 GetNextNumber ,则 GetNextNumber 返回的次数将比其他任何数字多1. 私有类RoundRobbinNumber{private int _maxNumbers = 10;private int _lastNumber;私人RoundRobbinNumber(int maxNumbers){_maxNumbers = maxNumbers;
..
System.Threading.Interlocked.CompareExchange 运算符提供Compare-And-Swap操作的原子(因此是线程安全的)C#实现. 例如 int i = 5;Interlocked.CompareExchange(ref i,10,5); 在此命令之后,int i的值将为10.并且比较和交换也自动进行(单个操作). 当我尝试将其与类实例一起使用
..
我有一个在多个线程之间共享的枚举: public enum Action { Read, Write, None } 在一个类中,我有一个Action类型的变量: public Action _action; 这是一个共享变量,即它已更新并从多个线程读取. 例如,我从一个线程执行 _action = Action.Read 还有另一个:
..
在执行值类型数组的MemberwiseClone时: var arr = new double[100]; 如果使用在其他线程上的互锁写入修改了这些双打,那么MemberwiseCloned副本是否有被撕裂的双打的风险?我不关心值是否有些陈旧,只是撕裂以及互锁和memberwiseclone之间的相互作用(我想这可以转换为内存blit类型的操作?) 解决方案 是.在32位操作系
..
我们的设置是:使用AutoFac for DI的Asp.NET + MVC5. 我们有一个类(单例),它正在管理各种服务的访问令牌.这些令牌有时不时地接近到期(不到10分钟),因此我们要求提供新令牌,并对其进行刷新.我当前的实现如下所示: // member int used for interlocking int m_inter = 0; private string Token
..
假设我有一个变量"counter",并且有多个线程通过使用互锁来访问和设置"counter"的值,即: int value = Interlocked.Increment(ref counter); 和 int value = Interlocked.Decrement(ref counter); 我可以假设Interlocked所做的更改在所有线程中都是可见的吗? 如果
..
我正在尝试使用 Interlocked.CompareExchange 与此枚举: public enum State { Idle, Running, //... } 以下代码无法编译,但这就是我想要做的: if (Interlocked.CompareExchange(ref state, State.Running, State.Idle) != St
..
InterlockedCompareExchangeRelease()和InterlockedCompareExchangeAcquire()有什么区别? 当我尝试使用WIN32 API学习同步功能时,我发现有两个函数的名称不同,但似乎做的是相同的事情: LONG __cdecl InterlockedCompareExchangeRelease( __inout LONG vo
..
我的游戏看起来像这样: public static float Time; float someValue = 123; Interlocked.Exchange(ref Time, someValue); 我想将Time更改为Uint32;但是,当我尝试使用UInt32而不是float作为值时,它抗议该类型必须是引用类型. Float不是引用类型,所以我知道使用非引用类型来做到这一点
..
Interlocked.Increment(ref x)在各种平台上的整数和多头交易是否比 x ++ 快或慢? 解决方案 它速度较慢,因为它会强制执行原子操作,并充当内存屏障,从而消除了处理器重新执行操作的能力。指令周围的顺序内存访问。 您应该使用Interlocked.Increment,当您希望动作在可以在线程之间共享的状态下是原子的时,这不是故意的完全替代x ++。
..
当你有一个 long[] myArray = new long[256]; 使用多个线程更改了其项目 Interlocked.Increment(ref myArray[x]) 肯定不会在某个时间点获得myArray的快照,因为同时发生了非锁定写入,因此我不打算这样做. 那么我真的必须对每个这样的元素进行Volatile.Read来获得过去某个时候所有值的副本吗?
..
我遇到了.NET 3.5的ConcurrentDictionary实现(很抱歉,我现在可以找到链接),该实现使用此方法进行锁定: var current = Thread.CurrentThread.ManagedThreadId; while (Interlocked.CompareExchange(ref owner, current, 0) != current) { } // PR
..
我正在寻找一种检查线程池中所有线程何时完成其任务的方法.当前,我正在使用一个计数器,该计数器在线程完成其工作时以及在counter == 0调用我的WorkComplete方法时递减.这似乎可行,但是当我进入最后的“工作"时,似乎无法处理结果了吗?或至少UI没有得到它.这是我目前拥有的: 排队工作项目+递增计数器 foreach (string s in URLs) {
..