问题标签 [wait-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 投票
5 回答
3857 浏览

java - 无锁和无等待线程安全延迟初始化

要执行无锁和无等待延迟初始化,我执行以下操作:

它工作得很好,除了一件事:如果两个线程看到 instance null,它们都会创建一个新对象,只有一个幸运的是通过 CAS 操作设置它,这会导致资源浪费。

有没有人建议另一种无锁延迟初始化模式,它降低了两个并发线程创建两个昂贵对象的可能性?

0 投票
2 回答
664 浏览

java - JAVA中的无等待队列实现

我一直在尝试使用Alex KoganErez Petrank此处获取的已编写的免等待队列,但遇到了问题。que()我无法理解第 5 页和第 7 页上的方法和方法中需要使用的确切线程 ID deque()

应该使用什么线程 ID?

0 投票
1 回答
1401 浏览

c# - 使用 SharedMemory MMF 实现快速 .NET 无锁进程间

我是新手,multitasking并且IPC我正在尝试构建一种使用共享内存进行快速进程间通信的方法(起初我正在研究 IPC 术语,考虑wcf socketsnamed pipes最终发现了 MMF)。

Lock既然我已经通过 using和signalling在两个进程之间使用共享内存成功地实现了一个小型测试EventWaitHandle,那么我将采用一种实现非阻塞/无等待模式的方法。现在,我正在Thread.MemoryBarrier()尝试signalling SectorMemoryMapedFile.

问题不明!第一轮通过,第二轮最后一次位于百慕大三角......超出了调试器的范围......

假设进程 ashowMsg()正在向进程 b发送一系列请求。

当我第一次使用命名管道解决方案时,与命名管道方法相比,Mmf 方法(尽管有Lock事件等待句柄)有很大的性能提升,但我什至可以以某种方式进一步使用上述方法......?

我可以像条纹 Raid 一样克隆这种模式......

所以我尝试了它并卡在了那个点上。

这是使用全内存围栏和共享内存进行信号传输的有效方法吗?

如果是这样,剩下的就是看看为什么第二次迭代失败了,性能差异。

编辑- 添加了额外线程测试背后的逻辑

这是我用来操作编写器线程的“桥梁”(读者使用相同的方法。

使用写句柄读写实际数据(类似的写代码)

正如我所说,我已经通过非阻塞/无等待等研究了数据和共享内存的同步问题。信号量锁,所以我试图在每个数据事务进入共享的过程中消除任何类型的开销内存映射文件。我在这里想问一下,消除 Lock 和 EventWaitHandle 并用内存栅栏的逻辑和通过 mmf 发出信号的逻辑替换它可能是什么问题?

0 投票
1 回答
111 浏览

c++ - 如何检查并发程序遵循的进度保证?

过去几周我一直在开发一些并发程序,想知道是否有任何工具可以自动检测其操作保证的进度条件类型,即它是无等待、无锁还是无阻塞。

我在网上搜索并没有找到任何这样的工具。

可以告诉如何推断程序的进度条件吗?

0 投票
2 回答
1008 浏览

c++ - boost::lockfree 中的“wait-free”到底是什么意思?

我正在阅读spsc_queue的文档,即使在其他地方阅读了一些内容后,我也不完全相信“无需等待”的含义。

他们在这里到底是什么意思

布尔推(T const & t);

将对象 t 推送到环形缓冲区。

注意:线程安全且无需等待

我的意思是同步必须有一些开销。是

保证花费恒定的时间?它与非线程安全队列相比如何?

PS:别担心,我会测量,但由于我天真无知,我无法想象一个不涉及某种等待的同步机制,我很困惑“无等待”应该告诉我什么。

0 投票
0 回答
543 浏览

multithreading - 以下对象是否免等待?

这是完整的问题:

以下属性是否等同于说对象 x 是无等待的?

对于 x 的每一个无限历史 H,每一个在 H 中执行无限步的线程都会完成无限次的方法调用。

所以我将无等待理解为无论如何,调用该方法的线程将在有限的步骤中完成方法执行。从示例中我们知道每个线程完成无限数量的方法。如果它不是无等待的,那么它应该已经在某个方法中停止(因此它应该采取无限数量的步骤来完成该方法),因此它无法完成无限数量的方法(因为它已经在方法的某个地方停止了)。所以它是无等待的.

上述推理是否正确?我将不胜感激更准确/正确的答案。

0 投票
1 回答
39 浏览

synchronization - 硬件fetch&add指令能否保证免等待执行?

那么,如果多个进程执行FAA,是否可以保证这条FAA指令会以无等待的方式执行呢?如果完成执行该指令的进程没有停在那里而是反复尝试执行它怎么办?

0 投票
2 回答
434 浏览

c++ - 无锁环形缓冲区的 boost 示例中的内存排序

当我阅读有关示例无等待环形缓冲区实现的 boost atomics 时:

https://www.boost.org/doc/libs/1_66_0/doc/html/atomic/usage_examples.html#boost_atomic.usage_examples.example_ringbuffer

我想知道 memory_order_acquire 是否需要

似乎 memory_order_relaxed 也应该起作用。我的论点是

发生之前

在 pop() 调用中。所以我们确定在我们存储 push() 调用之前已经读取了数据

我在下面粘贴了整个 boost 示例代码以便于参考。谢谢!

//上面的tail_.load可以使用boost::memory_order_relaxed吗?

};

0 投票
2 回答
1240 浏览

c++ - 无等待生产者和阻塞消费者的环形缓冲区

我有一个生产者线程,它产生对象的速度可能(暂时)太快以至于消费者线程无法消费。因此,我想要一个 FIFO 来缓冲剩余的工作。一旦 FIFO 已满,生产者将简单地退出或稍后重试。此外,我希望能够通知消费者不再需要做任何工作(无需将特殊对象排入 FIFO 队列)。生产者不应该减速,消费者不应该浪费CPU周期,所以我有以下要求:

  • 固定大小的环形缓冲区。
  • 生产者永远不会等待:它需要能够尽快将元素加入队列。
  • 消费者应该能够阻止: 不忙等待潜在的慢生产者。混合锁会很好。

我正在设想以下 C++ 类:

能够就地修改元素会很好。它还可以使用缓冲区的动态分配(例如,将大小传递给构造函数,缓冲区是 a unique_ptr)。

现在我的问题。这件事是否可能(至少在 x86 上)?

  • 如果是,它将如何工作?我真的很想要一些实现,最好但不一定是 C++。
  • 如果没有,为什么不呢?

指向相关材料的指针,即使它不能完全满足我的需求,也将不胜感激。

0 投票
0 回答
89 浏览

c++ - 为什么 Boost atomic 示例中的无等待多生产者队列是无等待的

我对 boost atomic 示例中的无等待多生产者队列有疑问。我认为'push'只是无锁而不是无等待,因为有一个'compare_exchange_weak循环',那么循环中可能会有一个特定的线程通过某种线程调度来进行不可预测的时间。此外,我认为“流行”是无需等待的

我的理解有错误吗?

http://www.boost.org/doc/libs/1_63_0_b1/doc/html/atomic/usage_examples.html#boost_atomic.usage_examples.mp_queue