草庐IT

c - 使用 Cache-Line 对齐对 C 中全局共享状态的修改进行无锁检查

编辑:ST不允许为新手发布两个以上的链接。很抱歉缺少引用资料。我正在尝试减少C应用程序中的锁定开销,其中检测全局状态的更改与性能相关。尽管我最近读了很多关于这个主题的书(例如很多来自H.Sutter的书,等等),但我对自己的实现没有信心。我想使用类似CAS的操作和DCL的组合来检查Cache-LineAligned全局变量,从而避免错误-sharing,从多个线程之间共享的数据中更新线程本地数据。我缺乏信心主要是因为我未能解释Type-Attributes上的GNU文档我似乎找不到任何可以轻松翻译成C语言的文献和示例,例如aligning-to-cache-line-and-knowi

无锁结构的 C++ 原子操作

我正在使用原子(双)比较和交换指令实现无锁机制,例如cmpxchg16b我目前正在汇编中编写它,然后将其链接。但是,我想知道是否有一种方法可以让编译器自动为我执行此操作?例如用“原子”包围代码块,让它弄清楚如何在底层处理器架构中将代码实现为原子指令(或者如果底层架构不支持,则在编译时生成错误)?附:我知道gcc有一些内置函数(至少对于CAS)http://gcc.gnu.org/onlinedocs/gcc-4.4.0/gcc/Atomic-Builtins.html#Atomic-Builtins 最佳答案 已经回答了here.C

c++ - 共享内存 IPC 同步(无锁)

考虑以下场景:要求:Intelx64服务器(多个CPU插槽=>NUMA)Ubuntu12、GCC4.6两个进程通过(命名)共享内存共享大量数据经典的生产者-消费者场景内存排列在一个循环缓冲区中(有M个元素)程序序列(伪代码):流程A(生产者):intbufferPos=0;while(true){if(isBufferEmpty(bufferPos)){writeData(bufferPos);setBufferFull(bufferPos);bufferPos=(bufferPos+1)%M;}}流程B(消费者):intbufferPos=0;while(true){if(isBuf

c++ - 无锁队列——单生产者,多消费者

我正在寻找一种方法来实现支持单个生产者和多个消费者的无锁队列数据结构。我看过MagedMichael和MichaelScott(1996)的经典方法,但他们的版本使用链表。我想要一个使用有界循环缓冲区的实现。使用原子变量的东西?顺便说一句,我不确定为什么这些经典方法是为需要大量动态内存管理的链表设计的。在多线程程序中,所有的内存管理例程都是序列化的。将无锁方法与动态数据结构结合使用,难道我们没有打败它们的好处吗?我正在尝试在英特尔64位架构上使用pthread库在C/C++中对此进行编码。谢谢你,希里什 最佳答案 循环缓冲区的使用使

c++ - 是否可以在 C++ 中实现无锁映射

我们正在开发基于C/S的网络应用程序,我们发现添加到std::map的锁过多,导致服务器性能变差。我想知道是否可以实现无锁map,如果可以,如何实现?那里有开源代码吗?编辑:实际上我们使用std::map来存储sockets信息,我们根据socket文件描述做了封装,包含一些其他必要的信息,比如ip地址、端口、socket类型、tcp或udp等。总而言之,我们有一张全局map说它是mapSocketsMap,那么每个用于发送数据的线程都需要访问SocketsMap,并且在从SocketsMap读取或写入SocketsMap之前必须添加互斥锁,这样会因为添加这么多锁而大大降低整个应用程序

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

要执行无锁和无等待延迟初始化,我执行以下操作:privateAtomicReferenceinstance=newAtomicReference(null);publicFoogetInstance(){Foofoo=instance.get();if(foo==null){foo=newFoo();//createandinitializeactualinstanceif(instance.compareAndSet(null,foo))//CASsucceededreturnfoo;else//CASfailed:otherthreadsetanobjectreturninstan

java - Java中的无锁并发链表

我想使用this中描述的链接列表。纸。但是,我在网上没有找到任何Java实现。如果不存在上述链接列表的java实现,我想,我会使用java.util.concurrent.ConcurrentLinkedQueue.这是一个不错的选择吗(它不是真正的链表)?如果这不是一个好的选择,有没有人知道Java中可靠的并发(线程安全)无等待(无锁)链表实现? 最佳答案 ConcurrentLinkedQueue是一个极好的无锁队列,可以做并发单链表可以做的事情。一个小警告:如果你不使用poll或peek而只使用iterator()(+.rem

c++ - 无锁引用计数和 C++ 智能指针

通常,最广为人知的C++中引用计数智能ptr类的实现,包括标准std::shared_ptr,使用原子引用计数,但不提供对同一个智能ptr实例的原子访问。换句话说,多个线程可以安全地运行在单独的shared_ptr上。指向同一个共享对象的实例,但多个线程不能安全地读/写同一个实例shared_ptr实例而不提供某种同步,例如互斥锁或其他什么。shared_ptr的原子版本名为“atomic_shared_ptr”已被proposed,初步implementations已经存在。大概,atomic_shared_ptr可以使用自旋锁或互斥锁轻松实现,但无锁实现也是可能的。在研究了其中的一

c++ - 什么是无锁多线程编程?

我看到有人/文章/SO帖子说他们为多线程使用设计了自己的“无锁”容器。假设他们没有使用影响性能的模数技巧(即每个线程只能基于某个模数插入),数据结构如何既是多线程的又是无锁的???这个问题是针对C和C++的。 最佳答案 无锁编程的关键是使用硬件固有的原子操作。事实上,即使是锁本身也必须使用那些原子操作!但是锁定和无锁编程之间的区别在于无锁程序永远不会被任何单个线程完全停止。相反,如果在一个锁定程序中,一个线程获得了一个锁,然后无限期地挂起,整个程序就会被阻塞并且无法继续进行。相比之下,即使单个线程无限期挂起,无锁程序也能取得进展。这

c++ - 什么是无锁多线程编程?

我看到有人/文章/SO帖子说他们为多线程使用设计了自己的“无锁”容器。假设他们没有使用影响性能的模数技巧(即每个线程只能基于某个模数插入),数据结构如何既是多线程的又是无锁的???这个问题是针对C和C++的。 最佳答案 无锁编程的关键是使用硬件固有的原子操作。事实上,即使是锁本身也必须使用那些原子操作!但是锁定和无锁编程之间的区别在于无锁程序永远不会被任何单个线程完全停止。相反,如果在一个锁定程序中,一个线程获得了一个锁,然后无限期地挂起,整个程序就会被阻塞并且无法继续进行。相比之下,即使单个线程无限期挂起,无锁程序也能取得进展。这