lockless相关内容

是否存在用于多个读取或写入线程的无锁队列之类的东西?

我在想,当多个线程正在读取或写入时,是否有可能有一个无锁队列?我见过一个带有无锁队列的实现,它与一个读取和一个写入线程一起工作,但任何一个线程都不会超过一个.是否可以?我不认为它是.有没有人想证明这一点? 解决方案 有多种算法可用,我最终实现了 An Optimistic Approach to Lock-Free FIFO Queues,通过指针标记避免ABA问题(需要x86 上的 CM ..
发布时间:2022-01-21 12:03:50 其他开发

如何构建无锁队列?

我今天花了很多时间研究无锁队列.我有多个生产者,多个消费者的情况.为了测试,我实现了一个在 Win32 下使用 Interlocked SList 的系统,它使我基于重线程任务的代码的性能提高了一倍.但不幸的是,我希望支持多个平台.在多个平台上互锁本身不是问题,我可以放心地假设我可以毫无问题地互锁.然而,实际的实现让我迷失了. 最大的问题似乎是您需要保证列表推送/弹出将仅使用一个互锁调用.否 ..
发布时间:2022-01-21 11:51:02 其他开发

如果我不使用围栏,一个核心需要多长时间才能看到另一个核心的写入?

我一直在尝试用 Google 搜索我的问题,但老实说我不知道​​如何简洁地陈述问题. 假设我在多核 Intel 系统中有两个线程.这些线程在同一个 NUMA 节点上运行.假设线程 1 写入 X 一次,然后只是偶尔向前读取它.进一步假设,除其他外,线程 2 连续读取 X.如果我不使用内存栅栏,线程 1 写入 X 和线程 2 看到更新的值之间可以间隔多长时间? 我知道 X 的写入将进入存储 ..
发布时间:2022-01-06 12:36:15 其他开发

如何使用 c++11 CAS 实现 ABA 计数器?

我正在实现一个基于此算法的无锁队列,它使用一个计数器来解决 ABA 问题.但我不知道如何用 c++11 CAS 实现这个计数器.例如从算法: E9: if CAS(&tail.ptr->next, next, ) 这是一个原子操作,意思是如果tail.ptr->next等于next,让tail.ptr->nextcode> 指向 node 并同时(原子地)使 next.count+1.但是,使 ..
发布时间:2021-12-06 11:19:15 C/C++开发

使用 memory_order_seq_cst 输出 10

当我运行这个程序时,我得到的输出为 10,这对我来说似乎是不可能的.我在 x86_64 核心 i3 ubuntu 上运行它. 如果输出是 10,那么 1 一定来自 c 或 d. 同样在线程 t[0] 中,我们将 c 赋值为 1.现在 a 是 1,因为它发生在 c=1 之前.c 等于被线程 1 设置为 1 的 b.所以当我们存储 d 时,它应该是 1,因为 a=1. 可以使用 me ..
发布时间:2021-06-04 20:40:56 C/C++开发

无锁堆栈实现想法-目前已中断

我想出了一个想法,我试图实现一个无锁堆栈,该堆栈不依赖引用计数来解决ABA问题,并且还可以正确处理内存回收.它在概念上与RCU相似,并且依赖于两个功能:将列表条目标记为已删除,以及跟踪遍历该列表的读者.前者很简单,它只使用指针的LSB.后者是我“聪明"地尝试实现一种无界无锁堆栈的方法. 基本上,当任何线程尝试遍历列表时,一个原子计数器(list.entries)都会增加.遍历完成后,第二个计 ..
发布时间:2020-07-24 07:43:33 其他开发

无锁更新中的SpinWait

在阅读 Albahari在C#中的线程时,我注意到“锁定免费更新"模式在周期结束时使用SpinWait: static void LockFreeUpdate (ref T field, Func updateFunction) where T : class { var spinWait = new SpinWait(); while (true) ..
发布时间:2020-07-24 07:43:29 C#/.NET

X86原子RMW指令是否等待免费

在x86上,像lock add dword [rdi], 1这样的原子RMW指令是使用现代CPU上的缓存锁定实现的.因此,在指令期间,缓存线被锁定.这是通过在读取值时获取行EXCLUSIVE/MODIFIED状态来完成的,并且在指令完成之前,CPU不会响应来自其他CPU的MESI请求. 并发进度条件有两种,阻塞和非阻塞.原子RMW指令是非阻塞的. CPU硬件在保持高速缓存锁定时将永远不会休眠 ..
发布时间:2020-07-24 07:43:26 其他开发

无锁和无锁有什么区别?

在一些有关算法的文章中,一些使用词lockfree,另一些使用lockless. lockless和lockfree有什么区别?谢谢! 更新 http://www.intel.com/content/dam/www/public/us/en/documents/guides/intel-dpdk-programmers-guide.pdf 第5.2节-"Linux *中的无锁环形 ..
发布时间:2020-07-24 07:43:22 其他开发

如果我不使用隔离墙,一个核心看到另一个核心的写入需要多长时间?

我一直在尝试搜索我的问题,但老实说,我不知道如何简洁地陈述这个问题. 假设我在多核Intel系统中有两个线程.这些线程在同一NUMA节点上运行.假设线程1向X写入一次,然后仅偶尔读取它.除其他事项外,进一步假设线程2连续读取X.如果我不使用内存隔离栅,线程1写入X和线程2看到更新后的值之间需要多长时间? 我知道X的写入将到达存储缓冲区,再从那里写入高速缓存,这时MESIF将启动,线程2 ..
发布时间:2020-07-24 07:43:19 其他开发

读者/作家的锁...没有读者的锁?

我觉得这可能是非常普遍和普遍的情况,存在着众所周知的无锁解决方案. 简而言之,我希望可以采用类似读/写器锁定的方法,但这并不需要读取器获得锁定,因此可以获得更好的平均性能. 取而代之的是,阅读器需要进行一些原子操作(128位CAS),而编写器则需要进行互斥操作.我将有两个数据结构副本,一个用于正常成功查询的只读副本,以及一个在互斥保护下进行更新的相同副本.将数据插入可写副本后,我们将其 ..
发布时间:2020-07-10 01:02:31 C/C++开发

用32位原子实现64位原子计数器

我想将原子uint32s的uint64原子计数器拼凑在一起.计数器只有一个作者和多个读者.编写器是信号处理程序,因此不能阻塞. 我的想法是将具有低位的世代计数用作读取锁定.读取器重试,直到整个读取期间生成计数稳定并且未设置低位为止. 以下代码在设计和使用内存顺序时是否正确?有更好的方法吗? using namespace std; class counter { atom ..
发布时间:2020-07-10 01:00:56 C/C++开发

是否存在诸如多个读取或写入线程的无锁队列之类的东西?

我当时在想,当多个线程正在读写时,是否可能会有一个无锁队列?我见过一个带有无锁队列的实现,该队列可处理一个读取线程和一个写入线程,但对于任何一个线程都不会超过一个.是否有可能?我认为不是.可以/想要证明吗? 解决方案 有多种算法可用,我最终实现了尽管如此,要真正真正实现无锁,您还需要无锁的内存分配器-请参见并发构建块)或 NBMalloc (但到目前为止,我还没有使用其中之一). 您 ..
发布时间:2020-05-13 21:54:49 其他开发

如何使用c ++ 11 CAS实现ABA计数器?

我正在基于此算法实现无锁队列,它使用计数器来解决ABA问题.但是我不知道如何用c ++ 11 CAS实现此计数器.例如,根据算法: E9: if CAS(&tail.ptr->next, next, ) 这是一个原子操作,这意味着如果tail.ptr->next等于next,让tail.ptr->next指向node,然后同时(原子上)生成n ..
发布时间:2020-05-13 20:31:21 C/C++开发

如何建立无锁队列?

我今天花了很多时间研究无锁队列.我有多个生产者,多个消费者的情况.为了测试,我使用Win32下的Interlocked SList东西实现了一个系统,它使我的基于重线程任务的代码的性能提高了一倍.但是,不幸的是,我希望支持多个平台.在多个平台上互锁本身不是问题,我可以放心地假设我可以互锁而不会出现问题.但是实际的实现使我迷失了. 最大的问题似乎是您需要确保列表推送/弹出仅使用一个互锁的呼叫. ..
发布时间:2020-04-27 03:39:03 其他开发

实现一个无锁队列(对于记录器组件)

我设计一个新的改进记录器组件(.NET 3.5,C#)。 我想用一个无锁的实现。 记录的事件将(可能)多线程发送,虽然只有一个的单的线程会做实际输出到文件/其它存储介质。 在本质上,所有的作家是*入队*的数据转换成一些队列,要通过一些其他进程(LogFileWriter)检索。 这能在锁定少的方式实现?我找不到一个直接引用在网络这个特定的问题。 解决方案 如果你发现 ..
发布时间:2016-09-28 14:52:20 C#/.NET

无锁队列的实现最终有在压力下循环

我在包含从多个线程发布到与在单个线程中处理的请求的链接列表的形式写在C无锁队列。压力的几个小时后,我最终的最后一个请求的下一个指针指向自己,创造无限循环并锁定了处理线程。 运行应用程序(和失败),在Linux和Windows。我调试在Windows上,在我的 COMPARE_EXCHANGE_PTR 映射到的 InterlockedCompareExchangePointer 。 这是code ..
发布时间:2016-08-22 14:13:56 C/C++