问题标签 [interlocked]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
93 浏览

c# - 64 位 C# 编译器/JITer 会对 Int64 上的互锁操作执行什么样的优化?

我正在处理一些需要支持 32 位和 64 位代码库的线程库代码,因此在有争议的路径中存在各种互锁调用,专门用于处理 Int64 的非原子加载和存储。

我想知道,在 64 位平台上执行时,在 Int64 上运行时是否有任何特殊优化?具体来说,Interlocked.Read(...) 调用是否转换为等效的普通赋值?结果被丢弃的 Interlocked.Exchange(...) 调用是否也变成了普通赋值?

0 投票
2 回答
4458 浏览

c# - Interlocked.Exchange 和 Volatile.Write 之间的区别?

Interlocked.Exchange和 和有什么不一样Volatile.Write

这两种方法都会更新某些变量的值。有人可以总结一下何时使用它们吗?

特别是我需要更新double我的数组的项目,我希望另一个线程看到最新的值。什么是首选?Interlocked.Exchange(ref arr[3], myValue)Volatile.Write(ref arr[3], info);在哪里arr声明为double


真实的例子,我这double​​样声明数组:

在一个线程中,我像这样更新它:

在另一个线程中,我像这样读取了这个数组:

对我来说,它按原样工作得很好。但是,为了确保“它始终有效”,无论我应该添加什么Volatile.WriteInterlocked.Exchange. 因为不保证双重更新是原子的。

在回答这个问题时,我想查看VolatileInterlocked类的详细比较。为什么我们需要 2 个类?哪一个以及何时使用?


另一个例子,来自生产项目中锁定机制的实现:

Release1如果此 API 的用户调用或方法,是否有任何实际区别Release2

0 投票
2 回答
237 浏览

c++ - 这有联锁吗?C++

请注意 - 这些构建适用于 VS2008/VS2010 构建,我不能使用任何 11 个构造。

想象一下,我有订阅者在听某个发布者。我的发布者有一个订阅者指针容器。在我的 void detach(ISubscriber *) 中,我不会锁定订阅者列表,而是将指针“NULL”出来,因为没有更好的词,对于那个订阅者。

第 3 行 - 测试指针并指向有效对象。在执行第 4 行之前,另一个线程将订阅者设为 NULL。第 4 行 - 繁荣。

我的问题,有没有一种方法可以使用某种互锁的东西,使测试和调用是原子的。

例如,对于析构函数中的引用计数对象,类似这样的工作

在这里,参考计数器自动递减并针对零进行测试,然后只有当等于零时,才会释放数据。

有没有办法让我根据指针的有效性来调用函数?

编辑1:我需要根据评论澄清一点,并感谢您的回复。发布者不负责订阅者的“内存释放”,因此不会有泄漏。在通知之后,发布者将通过一个循环,通过删除无效的订阅者来清理容器。

现在至于订阅者自己。当他们分离时,他们只是从听发布者分离。它们本身将存在于静态对象中(这是我们需要的合同)。为什么?因为我们不能在通知期间持有锁。唯一的其他选择是使用 Share_Ptr,由于未来的版本控制,决定不将其合并到此 DLL 中。

我创建了一个手写的 shared_ptr,但后来我突然想到,任何对未包含在资源管理类中的对象的引用都会落入同样的陷阱,只是推动订阅者必须确保不这样做的“要求”引用在其实现所述订阅者中的任何悬空引用。

这让我们回到刚才的说法,订阅者不能被“释放”,目前所有将使用它的客户端都是静态对象。我们只是在展望未来。一些用户是遗留应用程序,不容易引入 enabled_shared_from_this 等。

0 投票
2 回答
833 浏览

c - 如何在没有内存屏障的情况下实现 InterlockedIncrement

我实现了一个引用计数模式,为此我需要互锁设施,但没有内存围栏(据我所知)。

不幸的是,只有 Windows 具有 InterlockedDecrementNoFence 编译器内在函数。我如何使用 asm 内联来做到这一点?我也需要这个用于 gcc/clang。

0 投票
2 回答
954 浏览

c# - 我应该使用静态字段并互锁在一起吗?

我是否应该使用静态字段并互锁在一起,以防我需要使用静态字段提供线程安全和原子操作,静态字段是否默认是原子的?例如:

谢谢。

0 投票
3 回答
3350 浏览

c# - Interlocked.Exchange 澄清

我有一些简单的(希望是)问题,我一直无法找到答案 -

假设我有多个线程可以访问的对象 a、b。

如果 'b' 不是 volatile,这个操作会这样对待它吗?即它会从内存中获取这个变量的最新值吗?如果是这样,那是写的“原子”读吗?我知道 Interlocked.Exchange 的主要目的是您将获得以前的“a”值作为新写入的原子操作。但我的主要困惑是“b”的实际值被写入“a”。

我的第二个问题与本文中的一句话有关:

http://igoro.com/archive/volatile-keyword-in-c-memory-model-explained/

“一个有趣的点是,根据此处和此处记录的内存模型,C# 中的所有写入都是易失性的,并且可能也是这样实现的。C# 语言的 ECMA 规范实际上定义了一个较弱的模型,其中默认情况下写入不是易失性的。”

这是真的?如果是这样,如果不关心“a”的先前值,是否有 Interlocked.Exchange 的目的?(关于我的第一个例子)。我没有看到关于 StackOverflow 的任何其他文章或评论,因为每次写入都是易失性的。但是,我知道写入是原子的。

编辑:如果我的第一个问题的答案是“b”不被视为易失性,而我的第二个问题的答案是写入确实是易失性的,那么跟进是,如果我们不这样做,什么时候 interlocked.exhange 有用'不在乎'a'的先前值?

0 投票
7 回答
10074 浏览

c# - 互锁比较交换使用 GreaterThan 或 LessThan 代替相等

System.Threading.Interlocked对象允许将加法(减法)和比较作为原子操作。似乎不做相等但也将 GreaterThan/LessThan 作为原子比较的 CompareExchange 将非常有价值。

是 IL的假设Interlocked.GreaterThan特性还是 CPU 级别的特性?两个都?

缺少任何其他选项,是否可以在 C++ 或直接 IL 代码中创建这样的功能并将该功能公开给 C#?

0 投票
2 回答
5717 浏览

c# - 如果不相等,Interlocked.CompareExchange?

可能重复:
Interlocked.CompareExchange<Int> 使用 GreaterThan 或 LessThan 而不是相等

我知道 Interlocked.CompareExchange 仅在值和比较值相等时交换值,
如果它们不相等如何交换它们以实现这样的目标?

0 投票
1 回答
121 浏览

.net - 通过引用将值类型变量传递给静态方法线程安全吗?

代码如下所示:

我将在其他地方调用此方法,例如:

我以为 Interlocked.Increment 会处理线程安全问题,对吧?

编辑:

我有多个这样的 Job 类:

我相信在 catch 块中直接调用 Interlocked.Increment 可能是更好的方法。

但仍然想知道 JobManager.TrackExceptionCount(ref _exceptionCount) 是否可能工作

谢谢。

0 投票
4 回答
460 浏览

c# - 可以使用 Interlocked.CompareExchange 吗?

我有一个整数数组,用于跟踪 10,000 个并发任务的完成情况,其中值为 1 或 0。我认为如果这个数组是一个位数组并且每个并发线程使用 interlocked.CompareExchange(或类似的) 改变一个位。

如果 Interlocked 没有“位”过载,我应该如何处理?