interlocked相关内容

用MSVC实现C语言中的原子加载

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 ..
发布时间:2022-04-18 09:48:37 其他开发

Parallel.For() 和 Interlocked.CompareExchange():性能较差,结果与串行版本略有不同

我尝试使用 Parallel.For() 计算列表的平均值.我决定反对它,因为它比简单的串行版本慢四倍.然而,我对它产生的结果与串行结果不同这一事实很感兴趣,我认为了解原因会很有启发性. 我的代码是: public static double Mean(this IList list){双和 = 0.0;Parallel.For(0, list.Count, i => {双初始总和;双增量 ..
发布时间:2021-12-30 21:42:24 C#/.NET

易失性 vs. 互锁 vs. 锁定

假设一个类有一个被多个线程访问的public int counter 字段.这个 int 只会增加或减少. 要增加这个字段,应该使用哪种方法,为什么? lock(this.locker) this.counter++;, Interlocked.Increment(ref this.counter);, 将counter的访问修饰符改为public volatile. 现在我 ..
发布时间:2021-12-01 09:56:47 C#/.NET

原子 x86 指令与 MS 的 InterlockedCompareExchange 文档的对齐要求?

Microsoft 提供了 InterlockedCompareExchange 用于执行原子比较和交换操作的函数.还有一个 _InterlockedCompareExchange 内在. 在 x86 上,这些是使用 lock cmpxchg 指令实现的. 然而,通读关于这三种方法的文档,他们似乎在对齐要求上不一致. 英特尔的参考手册 没有提及对齐(除了那如果对齐检查已启用并且进 ..
发布时间:2021-11-30 14:47:39 其他开发

使用 Interlocked 测试并有条件地更新 long

是否有使用 Interlocked 类的巧妙方法来做到这一点?或者我应该只使用 lock { } 吗? 我的具体用例是我有多个线程来计算 long 值,并将其与共享的“最大值"值进行比较,仅当本地值较大时才替换共享值. 解决方案 试试 Interlocked.CompareExchange 方法.我没试过,但这样的事情对我来说似乎合乎逻辑: long localMax = Inte ..
发布时间:2021-09-07 18:36:40 C#/.NET

Lockfree 读取 Interlocked.Exchange 后的值?

假设我们有一个这样的类: 公共类Foo{私人酒吧酒吧=新酒吧();公共无效 DoStuffInThread1(){var old = Interlocked.Exchange(ref bar,new Bar());//做旧的事情//这里一切正常,我确定我有之前的 bar 值}public void OtherStuffFromThread2(){//我如何确保这里有最新的 bar ref//考虑 ..
发布时间:2021-06-04 20:20:17 C#/.NET

将Interlocked.CompareExchange与类一起使用

System.Threading.Interlocked.CompareExchange 运算符提供Compare-And-Swap操作的原子(因此是线程安全的)C#实现. 例如 int i = 5;Interlocked.CompareExchange(ref i,10,5); 在此命令之后,int i的值将为10.并且比较和交换也自动进行(单个操作). 当我尝试将其与类实例一起使用 ..
发布时间:2021-04-01 19:57:33 C#/.NET

多个线程之间共享的枚举

我有一个在多个线程之间共享的枚举: public enum Action { Read, Write, None } 在一个类中,我有一个Action类型的变量: public Action _action; 这是一个共享变量,即它已更新并从多个线程读取. 例如,我从一个线程执行 _action = Action.Read 还有另一个: ..
发布时间:2020-06-26 19:04:44 C#/.NET

.net System.MemberwiseClone和互锁的写入

在执行值类型数组的MemberwiseClone时: var arr = new double[100]; 如果使用在其他线程上的互锁写入修改了这些双打,那么MemberwiseCloned副本是否有被撕裂的双打的风险?我不关心值是否有些陈旧,只是撕裂以及互锁和memberwiseclone之间的相互作用(我想这可以转换为内存blit类型的操作?) 解决方案 是.在32位操作系 ..
发布时间:2020-06-26 19:04:42 C#/.NET

使用线程安全性更新单例的属性

我们的设置是:使用AutoFac for DI的Asp.NET + MVC5. 我们有一个类(单例),它正在管理各种服务的访问令牌.这些令牌有时不时地接近到期(不到10分钟),因此我们要求提供新令牌,并对其进行刷新.我当前的实现如下所示: // member int used for interlocking int m_inter = 0; private string Token ..
发布时间:2020-06-26 19:04:33 C#/.NET

与枚举互锁.比较交换

我正在尝试使用 Interlocked.CompareExchange 与此枚举: public enum State { Idle, Running, //... } 以下代码无法编译,但这就是我想要做的: if (Interlocked.CompareExchange(ref state, State.Running, State.Idle) != St ..
发布时间:2020-06-26 19:04:28 C#/.NET

C#互锁交换

我的游戏看起来像这样: public static float Time; float someValue = 123; Interlocked.Exchange(ref Time, someValue); 我想将Time更改为Uint32;但是,当我尝试使用UInt32而不是float作为值时,它抗议该类型必须是引用类型. Float不是引用类型,所以我知道使用非引用类型来做到这一点 ..
发布时间:2020-06-26 19:04:23 C#/.NET

互锁性能提升

Interlocked.Increment(ref x)在各种平台上的整数和多头交易是否比 x ++ 快或慢? 解决方案 它速度较慢,因为它会强制执行原子操作,并充当内存屏障,从而消除了处理器重新执行操作的能力。指令周围的顺序内存访问。 您应该使用Interlocked.Increment,当您希望动作在可以在线程之间共享的状态下是原子的时,这不是故意的完全替代x ++。 ..
发布时间:2020-05-30 20:06:27 C#/.NET

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

当你有一个 long[] myArray = new long[256]; 使用多个线程更改了其项目 Interlocked.Increment(ref myArray[x]) 肯定不会在某个时间点获得myArray的快照,因为同时发生了非锁定写入,因此我不打算这样做. 那么我真的必须对每个这样的元素进行Volatile.Read来获得过去某个时候所有值的副本吗? ..
发布时间:2020-05-14 00:44:48 C#/.NET

检查ThreadPool线程何时完成的正确方法?

我正在寻找一种检查线程池中所有线程何时完成其任务的方法.当前,我正在使用一个计数器,该计数器在线程完成其工作时以及在counter == 0调用我的WorkComplete方法时递减.这似乎可行,但是当我进入最后的“工作"时,似乎无法处理结果了吗?或至少UI没有得到它.这是我目前拥有的: 排队工作项目+递增计数器 foreach (string s in URLs) { ..
发布时间:2020-05-14 00:13:40 C#/.NET