草庐IT

c - 如何实现无锁但阻塞的行为?

我正在为一个密集型网络应用程序实现一个无锁的单一生产者单一消费者队列。我有一堆工作线程在它们自己单独的队列中接收工作,然后它们出队并处理。从这些队列中移除锁在高负载下大大提高了性能,但当队列为空时它们不再阻塞,这反过来导致CPU使用率飙升。我怎样才能有效地导致线程阻塞,直到它可以成功地使某些东西出队或被杀死/中断? 最佳答案 如果您使用的是Linux,请考虑使用Futex.它通过使用原子操作而不是像互斥锁那样的内核调用来提供非锁定实现的性能,但是如果由于某些条件不成立(即锁定争用)而需要将进程设置为空闲,它将然后进行适当的内核调用以

c - 如何在 C 中编写线程安全、高效、无锁的内存分配器?

如何在C中编写线程安全、高效、无锁的内存分配器?高效我的意思是:快速分配和释放优化内存使用(最小浪费且无外部碎片)最小的元数据开销 最佳答案 http://www.research.ibm.com/people/m/michael/pldi-2004.pdfThispaperpresentsacompletelylock-freememoryallocator.Itusesonlywidely-availableoperatingsystemsupportandhardwareatomicinstructions.Itoffersg

c - 如何在 C 中编写线程安全、高效、无锁的内存分配器?

如何在C中编写线程安全、高效、无锁的内存分配器?高效我的意思是:快速分配和释放优化内存使用(最小浪费且无外部碎片)最小的元数据开销 最佳答案 http://www.research.ibm.com/people/m/michael/pldi-2004.pdfThispaperpresentsacompletelylock-freememoryallocator.Itusesonlywidely-availableoperatingsystemsupportandhardwareatomicinstructions.Itoffersg

使用 std::atomic 的 C++11 无锁队列(多作者,单消费者)

我使用C++11中的新std::atomic生成了无锁(lockfree)队列的简单实现。我在这里看不到我做错了什么。#includetemplateclasslockless_queue{public:templatestructnode{node(constDataType&data):data(data),next(nullptr){}DataTypedata;node*next;};lockless_queue():head_(nullptr){}voidproduce(constT&data){node*new_node=newnode(data);//putthecurre

c++ - MVCC 实现中的无锁读写器同步

我一直在关注一些无锁代码的正确性,我真的很感激我能得到的任何输入。我的问题是关于如何在C++11的内存模型中使用获取和释放语义来实现一些所需的线程间同步。在我的问题之前,一些背景...在MVCC,作者可以安装对象的新版本而不影响旧对象版本的读者。但是,如果在具有更高编号时间戳的读取器已经获得对旧版本的引用时,写入器安装对象的新版本,则写入器事务将必须回滚并重试。这是为了保持可序列化的快照隔离(所以就好像所有成功的事务都按时间戳顺序一个接一个地执行)。读者永远不必由于写入而重试,但如果作者的事件会“从下面拉出地毯”,则可能必须回滚并重试具有更高编号时间戳的读者。为了实现此约束,使用了读取

c++ - 无锁原子在实践中是无地址的吗?

Boost.Interprocess是一个很棒的库,它简化了不同进程之间共享内存的使用。它提供互斥量、条件变量和信号量,允许在从共享内存写入和读取时进行同步。但是,在某些情况下,这些(相对)性能密集型同步机制不是必需的-原子操作足以满足我的用例,并且可能会提供更好的性能。不幸的是,Boost.Interprocess似乎没有原子性。C++标准库提供了std::atomic类模板,封装了需要原子操作的对象,也有测试原子操作是否无锁的函数。但它并不要求无锁原子也是无地址的:[atomics.lockfree]/4只是鼓励无锁操作是无地址的,这与cppreference一致。.我想不出任何人

c++ - 线程安全无锁数组

我有一个C++库,它应该在多个线程上进行一些计算。我制作了独立的线程代码(即它们之间没有共享变量),除了一个数组。问题是,我不知道如何让它成为线程安全的。我查看了互斥锁锁定/解锁(QMutex,因为我正在使用Qt),但它不适合我的任务-虽然一个线程将锁定互斥锁,但其他线程将等待!然后我阅读了有关std::atomic的内容,它看起来正是我所需要的。不过,我尝试通过以下方式使用它:std::vector>*myVector;它产生了编译器错误(useofdeletedfunction'std::atomic::atomic(conststd::atomic&)')。然后我找到thesol

c++ - boost::lockfree::queue 在 c++11 中不是无锁的吗?

在这个websocket++示例中,我试图用boost::lockfree::queue替换std::queuehttps://github.com/zaphoyd/websocketpp/blob/experimental/examples/broadcast_server/broadcast_server.cpp看起来它可以在不真正改变任何语法但删除boost::unique_lock行的情况下完成。但是,当我查看boost示例时,它有一个检查无锁的代码部分http://boost-sandbox.sourceforge.net/doc/html/lockfree/examples

c++ - C: 无锁内存分配库

有人对C/c++的无锁内存分配器有任何好的经验吗?我研究了boost和libcds,但我不确定要使用哪个库。背景,一直在研究一个“无锁、无等待、非阻塞、动态完美哈希、可扩展、并发哈希表”*是的,我知道这听起来很自命不凡,但这就是所谓的。无论如何,我正准备开始对其进行多线程测试,并且我需要找出在添加新节点时设置内存分配的最佳方式。(以及当我需要分配指针数组时)那么有没有人对无锁内存分配有什么好的经验? 最佳答案 漂亮的图表表明这个实现是好的:http://locklessinc.com/自2011年11月14日起,它是开源GPL3.0

c++ - 在 C++11 中以无锁方式原子交换两个 std::atomic<T*> 对象?

以下代码是从PARSECbenchmarksuiteforshared-memorymultiprocessors中的模拟退火应用程序中提取的原子指针类的框架。.在该应用程序中,中央数据结构是一个图形(更具体地说,是集成电路的网表)。图中的每个节点都有一个指示其物理位置的属性。该算法产生许多线程,每个线程重复并随机选择两个节点并交换它们的物理位置,如果这样可以为芯片带来更好的路由成本。由于图很大,每个线程都可以选择任意一对节点,唯一可行的解​​决方案是无锁并发数据结构(CDS)。这就是为什么以下AtomicPtr类是至关重要的(它用于以无锁方式自动交换指向两个物理位置对象的指针)。函数