问题标签 [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.
haskell - Haskell 中的无锁编程
有谁知道是否可以在 Haskell 中进行无锁编程?我感兴趣的问题是适当的低级原语是否可用,以及(如果有的话)关于在纯功能上下文中使用这些原语构建工作的大规模系统的任何信息。(我以前从未在纯函数上下文中进行过无锁编程。)例如,据我了解,Control.Concurrent.Chan 通道是建立在 MVar 之上的,它(据我所知)使用锁—— -原则上可以构建内部无锁的Chan原语版本吗?希望获得多少性能提升?
我还应该说我熟悉 TVar 的存在,但不了解它们的内部实现——我已经了解它们大多是无锁的,但我不确定它们是否是完全无锁。因此,任何有关 TVar 内部实现的信息也会有所帮助!
(这个线程提供了一些讨论,但我想知道是否有任何更新/更全面的内容。)
lock-free - 关于无锁队列的问题
我有一个关于使用无锁队列的问题。
假设我有一个单生产者单消费者队列,其中生产者和消费者绑定到不同的核心。队列元素是共享内存的缓冲区,由生产者和消费者在开始时进行映射。
生产者获取一个队列元素,用数据填充缓冲区并将其入队,消费者将元素出列,读取并以某种方式处理它。
作为无锁队列的用户,我是否必须明确确保生产者写入的缓冲区对用户可见?还是算法核心的 CAS(或其他类似)原语会自动提供障碍?
我见过的几个示例使用整数作为有效负载,因此不会出现内存同步的问题。
谢谢,
visibility - 无锁容器和可见性
我见过一些堆栈的无锁实现......我的问题是关于可见性,而不是原子性。例如,无锁堆栈的元素(不是指针)是否必须最多 64 位?我想是的,因为你不能保证知名度。真实的例子:这个结构可以安全地从无锁容器中插入和移除吗
编辑:有些人对这个问题感到困惑。稍微解释一下:如果作者将人推入堆栈,读者会得到它,是否保证读者看到(内存可见性)人的正确内容。
c# - 如何创建一个无锁集合的集合
我需要创建一个集合集合。该集合由多个线程调用以添加项目和查找项目。一旦添加,项目将不会被删除。目前,在添加元素时,我需要锁定整个集合。有没有办法让它无锁。或者我可以使用更好的数据结构或模式吗?这是我的代码的简化版本:
c - 圆形缓冲器与。锁定空闲堆栈以实现空闲列表
由于我一直在写一些多线程的代码,我想出了以下情况:
一个线程从内存池中声明一个资源单元,它处理它并将指向该数据的指针发送到另一个线程,以便使用循环缓冲区进行进一步操作(1R / 1W 情况)。
后者必须在处理完他收到的数据时通知前一个线程,以便可以回收内存。
我想知道将这个“Freelist”实现为另一个循环缓冲区 - 保存空闲资源的地址 - 还是选择无锁堆栈方式(在 x86-64 上实现 DCAS)是否更好 - 在性能方面。
一般来说,这两种不同方法的优缺点是什么?
c++ - C++无锁生产者/消费者队列
我正在查看无锁队列的示例代码:
http://drdobbs.com/high-performance-computing/210604448?pgno=2
(也在许多 SO 问题中参考,例如Is there a production ready lock-free queue or hash implementation in C++)
这看起来应该适用于单个生产者/消费者,尽管代码中有许多拼写错误。我已将代码更新为如下所示,但它让我崩溃了。任何人有建议为什么?
特别是,应该将divider 和last 声明为:
我在这台机器上没有支持 C++0x 的编译器,所以也许这就是我所需要的......
我编写了以下代码来测试这一点。Main(未显示)仅调用 TestQ()。
更新:最终崩溃是由队列声明引起的:
当我将其更改为简单数组时,它运行良好。(我实现了一个带锁的版本,它也崩溃了。)我看到析构函数在构造函数之后立即被调用,导致内存双重释放。但是,有谁知道为什么会立即使用 std::vector 调用析构函数?
c++ - C++ 中的读写线程安全智能指针,x86-64
我开发了一些无锁数据结构并出现以下问题。
我有编写器线程,它在堆上创建对象并将它们包装在带有引用计数器的智能指针中。我也有很多读者线程,可以处理这些对象。代码可能如下所示:
当我创建它的线程本地副本时ptr
,至少意味着
- 读取地址。
- 增加引用计数器。
我不能原子地执行这两个操作,因此有时我的读者会使用已删除的对象。
问题是 - 我应该使用什么样的智能指针来实现从多个线程进行读写访问并进行正确的内存管理?应该存在解决方案,因为Java程序员甚至不关心这样的问题,只是依靠所有对象都是引用并且只有在没有人使用它们时才被删除。
对于 PowerPC,我发现http://drdobbs.com/184401888看起来不错,但使用了 x86 中没有的 Load-Linked 和 Store-Conditional 指令。
据我了解,提升指针仅使用锁提供此类功能。我需要无锁解决方案。
c++ - 跨 2 个进程而不是线程的锁定自由/原子操作
我正在使用共享内存在多个进程之间共享一些数据;我使用进程间互斥锁来实现同步。
我的问题如下:是否可以使用无锁数据结构和/或原子操作来实现更快的同步,而无需在 2 个进程之间使用互斥锁?
如果没有,您知道造成这种情况的主要原因是什么吗?
它们仅用于同步同一进程的线程。这些概念是否也可移植到流程中?如果他们不是,您是否知道任何更快的跨进程共享/同步数据的方法?
boost - 深入使用无锁编程的高级抽象不流行的原因是什么?
从我在无锁编程中收集到的信息来看,要正确地做是非常困难的……我同意。光是想一些问题就头疼。但我想知道的是,为什么没有广泛使用高级包装器(例如无锁队列和类似的东西)?例如 boost 没有无锁库,尽管据我所知有人建议。我的意思是我猜有很多应用程序无法避免关键部分是负载的很大一部分这一事实。那么有哪些原因呢?是吗...
- 专利 - 我听说一些与无锁编程相关的东西获得了专利。
- 表现。
- 谷歌和微软都有这样的内部库,但没有一个是公开的......
- 还有什么?
所以我的问题是:为什么使用无锁编程的高级抽象不是很流行,而同时“常规”多线程编程是“in”?
编辑:boost 有一个无锁库 :)