问题标签 [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 投票
1 回答
1181 浏览

multithreading - 原子操作在进程间的工作方式是否与它们在线程间的工作方式相同?

显然,原子操作确保不同的线程不会破坏一个值。但是,当使用共享内存时,跨进程是否仍然如此?即使这些进程碰巧被操作系统安排在不同的内核上运行?还是跨不同的不同 CPU?

编辑:另外,如果它不安全,即使在像 Linux 这样的操作系统上也不安全,从调度程序的角度来看,进程和线程是相同的?

0 投票
6 回答
8014 浏览

multithreading - 什么时候无锁数据结构的性能低于互斥(互斥体)?

我在某处(再也找不到该页面)读到无锁数据结构“对于某些工作负载”更有效,这似乎意味着有时它们实际上速度较慢,或者在某些情况下它们的收益可能为零。对我来说,使用锁定指令的约 100 个周期来执行原子操作听起来比进入睡眠状态并等待调度程序唤醒进程备份要快得多,所以在什么情况下无锁数据结构对我来说并不明显不如老式的互斥锁更可取。如果锁在 99% 的时间内都可用并且进程不必进入睡眠状态,那么互斥锁会更快吗?假设有合适的无锁数据结构可用,是否有一个好的经验法则可以知道该走哪条路?

0 投票
4 回答
4458 浏览

multithreading - 随着更多 CPU 的添加,原子操作会变慢吗?

x86 和其他架构提供了特殊的原子指令(lock、cmpxchg 等),允许您编写“无锁”数据结构。但是随着越来越多的内核被添加,这些指令实际上必须在幕后完成的工作似乎会增加(至少要保持缓存一致性?)。如果今天在双核系统上原子添加需要大约 100 个周期,那么在未来的 80 多核机器上可能需要更长的时间吗?如果您要编写持久的代码,那么使用锁实际上可能是一个更好的主意,即使它们今天速度较慢?

0 投票
4 回答
2641 浏览

c++ - 线程安全、无锁增量功能?

更新:在 C 或 C++ 中可用的所有 Linux 发行版增量功能上是否有线程安全、无锁和可用?

0 投票
3 回答
3468 浏览

multithreading - Lockfree 标准合集和教程或文章

有人知道无锁常用数据类型的实现(意思是源代码)的好资源吗?我在考虑列表、队列等?

锁定实现非常容易找到,但我找不到无锁算法的示例以及 CAS 如何准确工作以及如何使用它来实现这些结构。

0 投票
5 回答
563 浏览

c# - 使用内存屏障

在下面的代码示例中,是否需要FuncA中的内存屏障来确保读取最新的值?

编辑:如果没有,我如何确保 FuncA 将读取最新值?(我想确保最近的值实际上存储在处理器的缓存中)[不使用锁]

0 投票
4 回答
447 浏览

c# - 写入/读取何时影响主内存?

当我将值写入字段时,关于新值何时保存在主存储器中,我能得到什么保证?例如,我怎么知道处理器没有将新值保存在它的私有缓存中,而是更新了主内存?
另一个例子:

是否有可能在Write()完成执行后,其他一些线程执行Read()但实际上会将“0”视为当前值?(因为也许之前对 m_foo 的写入还没有刷新?)。
什么样的原语(除了锁)可用于确保写入被刷新?


编辑
在我使用的代码示例中,写入和读取放置在不同的方法中。Thread.MemoryBarrier 不只影响存在于同一范围内的指令重新排序吗?

另外,假设它们不会被 JIT 内联,我如何确保写入 m_foo 的值不会存储在寄存器中,而是存储到主存储器中?(或者当 m_foo 被读取时,它不会从 CPU 缓存中获取旧值)。

是否可以在不使用锁或“volatile”关键字的情况下实现这一目标?(另外,假设我没有使用原始类型,而是使用 WORD 大小的结构[因此无法应用 volatile]。)

0 投票
4 回答
647 浏览

c# - 内存栅栏如何影响数据的“新鲜度”?

我对以下代码示例有疑问(取自:http ://www.albahari.com/threading/part4.aspx#_NonBlockingSynch )

紧随其后的是以下解释:

“障碍 1 和 4 阻止此示例写入“0”。障碍 2 和 3 提供新鲜度保证:它们确保如果 B 在 A 之后运行,读取 _complete 将评估为真。”

我了解使用内存屏障如何影响指令重新排序,但是提到的“新鲜度保证”是什么?

在文章的后面,也用到了下面的例子:

这个例子后面跟着这个解释:

“这个程序永远不会终止,因为完整的变量缓存在 CPU 寄存器中。在 while 循环内插入对 Thread.MemoryBarrier 的调用(或锁定读取完成)可以修复错误。”

再说一遍......这里会发生什么?

0 投票
3 回答
601 浏览

c++ - 如何以编程方式判断两个变量是否在同一个堆栈上?(在 Windows 中)

我在一个线程中。我有一个地址。该地址是否来自我正在使用的同一堆栈上的变量?

我需要实施on_same_stack(addr1, addr2). 我知道 Windows 上的堆栈会根据需要增长,但我也知道增长是有限制的,而且(至少在调试中)每个函数调用都有堆栈溢出检查代码。所以我认为这是可以做到的。

现在,我也知道我可以/应该使用线程 ID 等。但是我正在尝试在这里实现一些棘手的无锁编码,而且我真的没有空间来存储线程 ID,只有一个指针. (我希望避免 CMPXCH16)。请相信我,我有点知道我在做什么:-)。

这目前仅适用于 Windows。但是越便携越好。(NT/XP/7/CE?)

PS这个网站被称为“stackoverflow”所以它应该是正确的地方,不是吗?:-)

编辑:添加上下文,因为每个人都在问。我正在实现一个类似于 pthread_once 或 boost.threads call_once 的自定义 call_once。我正在尝试检查递归。我的工作非常有限。我无法添加函数参数。我无法假设程序的其余部分在做什么,比如他们已经使用了多少 TLS。等等。我只能在我的一个函数内编码,并且不能对除此之外的任何内容进行更改或假设。

感谢您的问题/回答。

0 投票
7 回答
4380 浏览

c# - 互锁和内存屏障

我对以下代码示例有疑问(m_value不是易失性的,每个线程都在单独的处理器上运行)

在 Foo() 中使用Interlocked.Exchange是否保证当 Bar() 被执行时,我会看到值“1”?(即使该值已经存在于寄存器或缓存行中?)或者我是否需要在读取m_value的值之前放置一个内存屏障?

另外(与原始问题无关),声明一个 volatile 成员并通过引用InterlockedXX方法传递它是否合法?(编译器警告通过引用传递 volatile,所以在这种情况下我应该忽略警告吗?)

请注意,我不是在寻找“更好的做事方式”,所以请不要发布建议完全替代做事方式的答案(“改用锁”等),这个问题纯粹出于兴趣..