草庐IT

c++ - 尝试实现无锁队列时发生堆栈溢出

我根据MagedM.Michael和MichaelL.Scott工作中指定的算法实现了一个无锁队列Simple,Fast,andPracticalNon-BlockingandBlockingConcurrentQueueAlgorithms(算法请跳转到第4页)我在shared_ptr上使用了原子操作,例如std::atomic_load_explicit等。当只在一个线程中使用队列时,一切都很好,但是当从不同线程中使用它时,我得到一个堆栈溢出异常。不幸的是,我无法追查问题的根源。似乎当一个shared_ptr超出范围时,它会减少下一个ConcurrentQueueNode的引用数量

c++ - 观察无锁队列的大小

全部我正在尝试使用boost库的无锁队列数据结构。#include#include但是,我发现这些数据结构不支持获取其中包含的当前条目数的方法(http://www.boost.org/doc/libs/1_53_0/doc/html/boost/lockfree/queue.html)。我想要的是类似于std::queue::size(http://en.cppreference.com/w/cpp/container/queue/size)的东西。非常感谢您的提前帮助! 最佳答案 如果您只想跟踪高/低水位线,请使用原子计数器,在

c++ - C++ 无锁队列实现中的虚假下溢

我正在尝试实现一个使用线性循环缓冲区来存储数据的无锁队列。与通用无锁队列相比,我有以下放宽条件:我知道将存储在队列中的最坏情况下元素的数量。队列是对一组固定元素进行操作的系统的一部分。代码永远不会尝试在队列中存储更多元素,因为此固定集合中有元素。没有多生产者/多消费者。队列将用于多生产者/单消费者或单生产者/多消费者设置。概念上,队列实现如下标准二次幂环形缓冲区。底层数据结构是一个使用power-of-twotrick的标准环形缓冲区。.读写索引只会递增。当使用简单的位掩码对数组进行索引时,它们被限制在底层数组的大小。读指针在pop()中以原子方式递增,写指针在push()中以原子方式

c++ - std::atomic 用于内置类型 - 非无锁与琐碎的析构函数?

查看std::atomic这是我阅读的默认专业:Thesespecializationshavestandardlayout,trivialdefaultconstructors,andtrivialdestructors.我还阅读了is_lock_free:Allatomictypesexceptforstd::atomic_flagmaybeimplementedusingmutexesorotherlockingoperations,ratherthanusingthelock-freeatomicCPUinstructions.Atomictypesarealsoallowed

c++ - 无锁实现中没有互斥锁的条件变量

我有一个使用std::atomics实现的无锁单生产者多消费者队列以类似于HerbSuttersCPPCon2014演讲的方式。有时,生产者速度太慢,无法满足所有消费者的需求,因此消费者可能会挨饿。我想防止饥饿的消费者排队,因此我为10ms添加了一个sleep。.这个值是任意的,不是最优的。我想使用一个信号,一旦队列中再次有空闲槽,消费者就可以发送给生产者。在基于锁的实现中,我自然会使用std::condition_variable为了这个任务。但是,现在在我的无锁实现中,我不确定引入mutex是否是正确的设计选择。,只能使用std::condition_variable.我只想问你,

c++ - 无锁pop()中使用引用参数返回值的缺点

我目前正在阅读Williams的“C++ConcurrencyinAction”。现在我停止了专门讨论无锁pop()实现的话题。无锁弹出:voidpop(T&result){node*old_head=head.load();while(!head.compare_exchange_weak(old_head,old_head->next));result=old_head->data;}这里引用这段代码的讨论:Thesecondproblemisanexception-safetyissue.Whenwefirstintroducedthethread-safestackbackin

c++ - 什么时候需要无锁数据结构来跨线程读取/写入音频应用程序中的数据?

我的场景是这样的:用户与GUI元素交互,音频回调函数读取UI设置的变量,计算样本并将样本存储在缓冲区(或任何数据结构)中,缓冲区然后由UI读取并绘制波形(在绘制循环中每秒60次)。现在,根据我读过的一些资料(Linux音频开发列表中的一个线程,this和this),我需要某种无需锁定即可同时读取和写入的数据结构,或者,我需要某种跨线程通知系统来传递变量。然而,someexamples我见过使用C++std库中的普通vector,它们从一个线程读取并从另一个线程写入,当我运行程序时,它们运行良好。在哪些情况下我需要使用无锁数据结构来进行这种跨线程通信?如果我添加另一个线程(例如MIDI或

c++ - C++ 中的无锁数据结构 = 仅使用原子和内存排序?

我曾经看到术语“无锁数据结构”并认为“哦哦哦,那一定非常复杂”。然而,我一直在阅读“C++ConcurrencyinAction”,它似乎编写了一个无锁数据结构,你所做的就是停止使用互斥锁/锁并用原子代码替换它们(以及可能的内存排序障碍)。所以我的问题是-我在这里遗漏了什么吗?由于C++11,它真的那么简单吗?写无锁数据结构只是用原子操作代替锁的情况吗? 最佳答案 噢噢噢,但这真的很复杂。如果您看不出互斥锁和原子访问之间的区别,那么您看待并行处理的方式就有问题,您编写的代码很快就会有问题。它很可能会比等效的阻塞版本运行得慢,如果您(

c++ - struct 专用原子类型如何实现无锁?

我找到了下面的代码,输出总是:std::atomicislockfree?falsestd::atomicislockfree?true这是代码:structA{inta[100];};structB{intx,y;};intmain(){std::coutislockfree?"{}.is_lock_free()islockfree?"{}.is_lock_free()我不明白为什么第二个结构专用原子类型是无锁的而第一个专用原子类型不能是无锁的?提前致谢。 最佳答案 http://en.cppreference.com/w/cpp

c++ - 为什么这个无锁堆栈类中的 'deleting' 节点会导致竞争条件?

在AnthonyWilliams的《C++ConcurrencyinAction》一书中,第7.2.1节列出了一个无锁堆栈实现:templateclasslock_free_stack{structnode{shared_ptrdata_;node*next_;node(constT&data):data_(make_shared(data)){}};atomichead_;public:voidpush(constT&data){node*new_node=newnode(data);new_node->next_=head_.load();while(!head.compare_e