问题标签 [lock-free]

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 投票
8 回答
27661 浏览

c - 如何保证 64 位写入是原子的?

当在基于 Intel x86 的平台(特别是基于 Intel 的 Mac 使用 Intel 编译器运行 MacOSX 10.4)上用 C 编程时,何时可以保证 64 位写入是原子的?例如:

如果在对 y 的第一次赋值完成执行后另一个线程正在检查 y 的值,我想确保它看到值 0xfedcba87654321 或值 0x12345678abcdef,而不是它们的混合。我想在没有任何锁定的情况下执行此操作,并且如果可能的话,无需任何额外的代码。我希望,在能够支持 64 位代码(MacOSX 10.4)的操作系统上使用 64 位编译器(64 位 Intel 编译器)时,这些 64 位写入将是原子的。这总是正确的吗?

0 投票
21 回答
10671 浏览

multithreading - 如何编写无锁结构?

在我的多线程应用程序中,我看到其中存在严重的锁争用,从而阻碍了跨多个内核的良好可扩展性。我决定使用无锁编程来解决这个问题。

如何编写无锁结构?

0 投票
5 回答
2595 浏览

.net - .net 中的无锁结构

我是 .net 的新手,想知道 .net 是否具有 Java 等效的 AtomicInteger、ConcurrentLinkedQueue 等?

我做了一些搜索,但什么也想不出来。

无锁算法需要某种 CAS 指令,它是通过 Java 中未记录的 Unsafe 类提供的,.net 有什么等价的吗?

0 投票
4 回答
1696 浏览

c# - 无锁列表求助!

嗨,我正在尝试编写一个无锁列表,我认为添加部分正在工作,但是从列表中提取对象的代码不起作用:(

那么这个列表不是一个普通的列表..我有接口 IWorkItem

好吧,我有一个列表,我可以在其中添加这个:P,理想的是当我运行 Get(); 在列表上它应该循环它,直到它找到一个 IWorkItem

并将其从列表中删除并返回..我在我的双核 cpu 上运行了许多线程的测试,似乎 Add 工作到目前为止从未失败,但是 Get 函数丢失了一些我不知道有什么问题的工作项.. ...

ps如果我得到这个工作,任何人都可以免费使用代码:)好吧,你是任何方式,但我不明白它被窃听时的重点:P

代码在这里http://www.easy-share.com/1903474734/LinkedList.zip如果您尝试运行它,您会发现它有时无法获得与它放入的一样多的工作项列表...

编辑:我有一个无锁列表工作它比使用 lock(obj) 语句更快,但我有一个使用 Interlocked 的锁对象,它仍然优于无锁列表,我将尝试制作一个无锁数组列表,如果我当我在这里完成上传结果时得到相同的结果..

0 投票
4 回答
20619 浏览

.net - 在 C# 中锁定空闲堆栈和队列

有谁知道是否有任何可用于 .NET 的无锁容器库?

最好是被证明比我们在 .NET 中的同步包装器更有效且更快的东西。

我在 .NET 上找到了一些文章,但没有一篇指定任何速度基准测试,也没有激发人们对其可靠性的信心。

谢谢

0 投票
8 回答
2598 浏览

c# - 在深度不可变类型上进行延迟初始化是否需要锁?

如果我有一个非常不可变的类型(所有成员都是只读的,如果它们是引用类型成员,那么它们也指的是非常不可变的对象)。

我想在类型上实现一个惰性初始化属性,如下所示:

据我所知:

...是线程安全的。我不太担心两个线程都竞相同时初始化,因为这种情况很少见,从逻辑角度来看,两个结果都是相同的,如果我没有,我宁愿不使用锁到。

这行得通吗?优缺点都有什么?

编辑: 感谢您的回答。我可能会继续使用锁。然而,令我惊讶的是,没有人提出编译器意识到临时变量是不必要的,只是直接分配给 m_PropName 的可能性。如果是这种情况,那么读取线程可能会读取尚未完成构造的对象。编译器会阻止这种情况吗?

(答案似乎表明运行时不允许这种情况发生。)

编辑: 所以我决定采用受 Joe Duffy 的这篇文章启发的 Interlocked CompareExchange 方法。

基本上:

这应该确保在此对象实例上调用此方法的所有线程都将获得对同一对象的引用,因此 == 运算符将起作用。可能会浪费工作,这很好 - 它只是使它成为一个乐观的算法。

正如下面的一些评论所指出的,这取决于 .NET 2.0 内存模型的工作。否则,应将 m_PropName 声明为 volatile。

0 投票
4 回答
606 浏览

multithreading - 有没有办法可以使两次读取原子?

我遇到了一种情况,我需要内存中两个值的原子和。我继承的代码是这样的:

a 和 b 的单独读取是原子的,并且代码中其他地方对这两个内存位置的所有写入也是无锁原子的。然而,问题在于这两个位置的值可以并且确实在两次读取之间发生变化。

那么如何使这个操作原子化呢?我对 CAS 了如指掌,但它往往只涉及使读-修改-写操作原子化,而这并不是我想在这里做的。

有没有办法做到这一点,或者是重构代码的最佳选择,以便我只需要检查一个值?

编辑:谢谢,我没有提到我想在第一个修订版中无锁地执行此操作,但在我第二个修订版后有人接受了它。我知道当人们说这样的话时没有人相信,但我实际上不会使用锁。我必须用原子来模拟互斥锁,这比重构代码以跟踪一个值而不是两个值要多得多。

目前,我的调查方法涉及利用值是连续的这一事实,并通过 64 位读取原子地抓取它们,我确信这在我的目标平台上是原子的。如果有人有新的想法,请贡献!谢谢。

0 投票
2 回答
1064 浏览

algorithm - 没有任何额外工作,普通的联合/查找算法线程是否安全?

对于单线程情况,标准的联合/查找或不相交集数据结构具有非常好的运行时间(有效地)。O(1)但是在多线程情况下它的有效性/性能是什么?我认为即使没有锁定或除了原子指针大小的写入之外的任何原子操作,它也是完全有效的。

有人看到以下逻辑有任何问题吗?

首先,我假设指针大小的写入是原子的。由此,不难争辩说您可以安全地find在多个线程中运行该函数,因为将发生的唯一更新都设置为相同的值。如果您允许find函数在调用时返回正确的答案(而不是在返回时),那么不难争辩说可以同时运行多个finds 和单个;unions的参数find不变,union唯一的更新根和finds 从不更新根。

至于剩下的情况(几个union),我认为这也行得通,但我不太确定。

顺便说一句:我不要求解决方案与单线程版本一样高效。(为了避免锁/原子,我也愿意丢弃全局相干状态。)


编辑:再看一下,多联合案例不起作用,因为如果不是新根的一侧与其他东西联合(也不是根),那么您可以将其从第二个联合的另一侧切断.

这可以通过CAS来回避:

0 投票
4 回答
1337 浏览

c++ - 那里有围绕 Win32 的无锁 SList 的像样的 C++ 包装器吗?

Windows 提供了一个无锁的单链表,如本页所述: Win32 SList

我想知道是否存在围绕此功能的良好 C++ 包装器。当我说好时,我的意思是它尽可能地导出通常的 STL 接口,支持迭代器等。我宁愿使用别人的实现也不愿坐下来编写一个 STL 类型的容器。

0 投票
9 回答
10052 浏览

c# - 是否可以使用无锁(等待)双向链表?

用 C# 标签问这个问题,但如果可能的话,应该可以用任何语言。

是否可以使用互锁操作实现双向链表以提供无等待锁定?我想插入、添加和删除,无需等待即可清除。