草庐IT

c++ - C++11 中的无锁多生产者/消费者队列

我正在尝试在C++11中实现一个无锁的多生产者、多消费者队列。我这样做是作为一个学习练习,所以我很清楚我可以只使用现有的开源实现,但我真的很想找出为什么我的代码不起作用。数据存储在一个环形缓冲区中,显然它是一个“有界MPMC队列”。我对它的建模与我读到的Disruptor非常接近。我注意到的是,它在单个消费者和单个/多个生产者的情况下工作得非常好,只是多个消费者似乎打破了它。这是队列:templateclassQueue:publicIQueue{public:explicitQueue(intcapacity);~Queue();booltry_push(Tvalue);booltr

c++ - 是否存在乐观的无锁 FIFO 队列实现?

是否有“optmisticapproachtolock-freeFIFOqueues"algorithm”的任何C++实现(源代码)? 最佳答案 HerbSutter他在Dr.DobbsJournal的EffectiveConcurency专栏中介绍了这样一个队列。WritingLock-FreeCode:ACorrectedQueue 关于c++-是否存在乐观的无锁FIFO队列实现?,我们在StackOverflow上找到一个类似的问题: https://s

c++ - 为什么标准库不以无锁方式为 8 字节以下的结构实现 std::atomic?

假设架构可以以无锁方式支持std::atomic的8字节标量。为什么标准库不为小于8字节的结构提供类似的特化?这种std::atomic特化的简单实现可以将结构序列化/反序列化(使用std::memcpy)到等效的std::uintx_t中x是结构的宽度(以位为单位)(四舍五入到最接近的大于或等于结构宽度的2的幂)。这将被很好地定义,因为std::atomic要求这些结构可以简单地复制。例如。https://godbolt.org/z/sxSeId,这里的Something只有3个字节,但是实现调用了__atomic_load和__atomic_exchange,两者都使用了锁表。

c++ - 在 C\C++ 中实现多生产者/消费者无锁队列

我已经在无锁队列上完成了单个生产者/消费者的基本实现,并且运行良好。但是,当我尝试将其扩展到多个生产者/消费者时,我开始遇到冲突。我通过SO找到了与此问题相关的类似帖子(Istheresuchathingasalocklessqueueformultiplereadorwritethreads?),并且我发现了一篇文章,该文章对原始实现进行了更深入的介绍。我也对这篇文章感到困惑,希望得到一些指导。首先是这个实现在使用多个生产者/消费者时是否真的有效,或者我在使用多个生产者/消费者设置的原始Michael-Scott实现中是否缺少某些东西。第二篇在文章AnOptimisticApproa

java - 无锁算法中的ABA

我了解ABA问题。但我无法理解的是:他们说在具有自动垃圾收集的语言中它可能不会显示。所以我的问题是:自动垃圾回收如何防止ABA问题的发生?在Java中是否可行?如果可行,如何实现?是否有可能阻止这种情况的发生? 最佳答案 启用自动垃圾回收后,任何两个对象都不能分配相同的引用并同时共存,这是因为只要引用计数大于0,引用本身就不会被释放和重新使用。因此当有人仍然拥有旧引用时,您不能将引用内容“切换”为不同对象的“点”。 关于java-无锁算法中的ABA,我们在StackOverflow上找到

java - Guava 中使用的无锁懒加载模式真的是线程安全的吗?

某些Guava内部类型,如AbstractMultiset,具有如下模式:privatetransientSetelementSet;@OverridepublicSetelementSet(){Setresult=elementSet;if(result==null){elementSet=result=createElementSet();}returnresult;}SetcreateElementSet(){returnnewElementSet();}想法是延迟创建CollectionView(elementSet()、entrySet()),直到真正需要它们为止。进程周围没

java - 无等待和无锁算法的示例/说明

我读过无等待导致所有线程独立完成,无锁确保程序作为一个整体完成。我不太明白。谁能举个例子(java)来说明这一点。编辑:无锁是否意味着程序没有死锁? 最佳答案 如果一个程序是无锁的,它基本上意味着至少一个它的线程保证在任意时间段内取得进展。如果一个程序死锁,它的所有线程(因此整个程序)都不能取得进展——我们可以说它不是无锁的。由于无锁程序可以保证取得进展,因此它们可以保证完成(假设有限执行没有异常)。Wait-free是一个更强的条件,这意味着每个线程都保证在任意时间段内取得进展,而不管线程执行的时间/顺序如何;所以我们可以说线程独

python - 这种 Python 生产者-消费者无锁方法是线程安全的吗?

我最近编写了一个使用简单的生产者/消费者模式的程序。它最初有一个与不正确使用threading.Lock有关的错误,我最终修复了它。但这让我想到是否可以以无锁的方式实现生产者/消费者模式。我的要求很简单:一个生产者线程。一个消费者线程。队列中只有一项。生产者可以在当前项目被消费之前生产下一个项目。因此,当前项目丢失了,但这对我来说没关系。消费者可以在生产下一个项目之前消耗当前项目。因此,当前项目被消耗了两次(或更多),但这对我来说没问题。所以我这样写:QUEUE_ITEM=None#thisisexecutedinonethreading.Threadobjectdefproducer

synchronization - 如何将此代码转换为非阻塞和无锁的?

我有队列,必须有越来越大的缓冲区,这不包括我在go中使用缓冲channel。经过一些谷歌搜索后,我想出了这段代码:import("sync")typeQueuestruct{nodes[]interface{}head,tail,countintlcksync.RWMutex}func(q*Queue)Enqueue(vinterface{}){q.lck.Lock()deferq.lck.Unlock()ifq.nodes==nil{q.nodes=make([]interface{},2)}ifq.head==q.tail&&q.count>0{nodes:=make([]inte

thread-safety - Go 的缓冲 channel 是无锁的吗?

Go的缓冲channel本质上是一个线程安全的FIFO队列。(参见IsitpossibletouseGo'sbufferedchannelasathread-safequeue?)我想知道它是如何实现的。它是否像Istheresuchathingasalocklessqueueformultiplereadorwritethreads?中描述的那样是无锁的??在Go的src目录中进行greping(grep-rLock.|grepchan)给出以下输出:./pkg/runtime/chan.c:Lock;./pkg/runtime/chan_test.go:m.Lock()./pkg/