问题标签 [lockless]
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.
multithreading - 无锁编程比自旋锁有什么优势?
我想知道无锁编程比自旋锁有哪些优势?我认为当我们在一个线程(称为A)中使用CAS机制进行无锁编程时,如果其他线程更改CAS中的值,A线程仍然需要再次循环。我认为这就像我们使用自旋锁一样!
我对此很困惑。虽然我知道CAS和spin-lock适合在锁竞争不激烈的情况下使用,但有人可以解释一下在哪些场景应该使用lock free和应该使用spin lock?
c++ - 使用 memory_order_seq_cst 输出 10
当我运行这个程序时,我得到的输出为 10,这对我来说似乎是不可能的。我在 x86_64 core i3 ubuntu 上运行它。
如果输出为 10,则 1 必须来自 c 或 d。
同样在线程 t[0] 中,我们将 c 赋值为 1。现在 a 为 1,因为它出现在 c=1 之前。c 等于 b,线程 1 将其设置为 1。所以当我们存储 d 时,它应该是 1,因为 a=1。
- memory_order_seq_cst 可以输出 10 吗?我尝试在第一行(变量 =1 )和第二行(printf)之间的两个线程上插入 atomic_thread_fence(seq_cst) 但它仍然不起作用。
取消注释两个栅栏都不起作用。尝试使用g++和clang++运行。两者都给出相同的结果。
c - 锁之前/之后的代码总是串行执行?
代码块可能包含很多代码,以它为一个单元即可。
CodeBlockA CodeBlockB CodeBlockC 是否总是串行执行?lock 是如何实现的?</p>
c# - 整数的无锁多线程
假设有一个函数在任何给定时间只能由一个线程执行,其余的只是返回(因为已经在处理特定状态),实现这一点的最佳方法是什么?
如果 m_isRunning 是一个状态(即表示枚举的整数),是否会应用相同的机制?
c++ - 具有非原子大小项目的无锁双端队列
我正在使用“用于弱内存模型的正确和高效的工作窃取”中描述的工作人员双端队列。我希望队列项目的大小为 16 字节,并且我只关心 Intel/AMD Windows x64 和 VS 2019。
我知道 16 字节(比如 __m128)对齐的加载/存储在现代处理器中通常是原子的,但规范不能保证它们。
双端队列的类型是:
重要的是,数组缓冲区项特别具有原子类型。如果我用 VS2019 编译它,我可以看到它用自旋锁使缓冲区项大小膨胀——我不想要这个。有可能预防吗?特别是因为我只关心带有某些保证的 x64。
双端队列上的动作由函数给出:
其中很多都是多余的,应该在 x64 上进行优化。事实上,论文在 thread_fence(seq_cst) 行的 take 函数中指定了只需要一个内存栅栏。虽然我不确定如果队列项目类型的大小为 16 字节,这是否是真的?
似乎 take()/push() 必须发生在同一个线程中,所以它们之间没有问题。因此,危险在于任何调用steal() 的线程读取部分写入的16 字节项目。但是由于 push() 仅在写入所有 16 个字节后才进行内存围栏,并且仅在此之后才更新底部,看来在 x64 上这不是问题?
我做了一个实验,我删除了缓冲区项目上的原子限定符,并通过 volatile 指针对缓冲区进行了简单的分配。它似乎工作正常,但显然这并不确定!
如果这是不可能的,那么也许使用 cmpxchg16b 是加载/存储 16 字节我的具体情况的更好选择?或者通过将队列项作为索引并无锁分配索引的 16 字节插槽来使这一切变得复杂。
所以我的问题的简化版本是:在 x64 上,我可以简单地将 Array 缓冲区类型的定义更改为指向非原子限定 16 字节结构项目数组的 volatile 指针,并在上述函数中更改这些项目的加载和存储到简单的非原子赋值表达式?
c++ - memory_order_relaxed 是否尊重同一线程内的数据依赖关系?
鉴于:
假设只有一个线程写入,是否有可能f
返回一个值?对于非原子变量,这显然不是真的,但我不知道放松是否如此放松以至于它会忽略同一线程中的数据依赖关系?10
x
c++ - 在具有相同顺序的原子加载/存储之前使用 std::atomic_thread_fence 总是多余的吗?
鉴于:
可以去掉调用std::atomic_thread_fence
有什么影响吗?如果是这样,有一个简洁的例子吗?请记住,其他功能可能会存储/加载到b
和调用f
.