我想知道asm中的输入操作数"m"(var)和 output 操作数"=m"(var)是做什么的: 我在 SPMC 队列中遇到了上面 的两行。 副作用是什么? 上面的行没有 asm 指令,所以我相信作者试图利用一些明确定义的副作用(例如,如果write_idx和blk的值在第二行,它们会被寄存器刷 ...
我想知道asm中的输入操作数"m"(var)和 output 操作数"=m"(var)是做什么的: 我在 SPMC 队列中遇到了上面 的两行。 副作用是什么? 上面的行没有 asm 指令,所以我相信作者试图利用一些明确定义的副作用(例如,如果write_idx和blk的值在第二行,它们会被寄存器刷 ...
我最近在学习无锁并发中的可重入锁时遇到了以下代码: 但是,我不确定释放栅栏调用是否不排除在它之前的线程中进行后续 memory 操作的可能性,以及获取栅栏是否排除在它之后进行更早的 memory 操作的可能性。 如果他们不这样做,从技术上讲,优化可能会导致这条线吗? 在调用之前在同一线程上完成并成 ...
我正在阅读 ConcurrentQueue 的源代码,这里有一些代码: GetHeadTailPositions() 可能想要在特定时间获取 4 个变量,但是,在“where”循环中有 4 个比较,考虑以下序列: 然后我们得到这些变量的不稳定版本。 这个方法稳定吗? 如何在没有锁定的情况下在特定 ...
赏金将在 7 小时后到期。 此问题的答案有资格获得+50声望赏金。 madhur4127想提请更多人注意这个问题: 这是一个小众问题,所以是的,这值得赏金我正在寻找类似于由boost::lockfree::spsc_queue和boost::interprocess提供的 SHM(共享内存)SP ...
赏金将在 5 天后到期。 此问题的答案有资格获得+50声望赏金。 Yam Marcovic正在从可靠的来源寻找答案: C++ 标准或 CppReference 的摘录在这里清楚地得出了可靠的结论,如果可能的话要简明扼要。 这个主题有很多微妙之处,需要筛选的信息也很多。 我找不到专门解决这个问题 ...
我了解到从不同的线程访问相同的 Object 不是线程安全的,应该受到保护。 通过锁定或“Interlocked.Exchange”或不可变或任何其他方式。 这意味着以下代码可能不是线程安全的,因为它不保护对共享“测试”object 的访问。 我的问题是: 以下代码是否安全? 如果不是,可能发生的 ...
我需要为以下场景构建数据结构。 有多个生产者,他们需要向消费者发送数据。 有多个消费者,他们需要从生产者那里接收数据到目前为止,这是非常典型的mpmc队列用例。 但是,我还有一个限制。 每个消费者都必须能够读取生产者发送的所有数据。 当然,某些消费者必须能够读取第二个或第三个元素,而其他消费者读取第 ...
对于加速数据结构上的并行工作,我目前使用SpinLock ,但想设计无锁算法。 数据结构是一个锯齿状数组,其中每个内部数组都有不同的大小。 工作线程应该获取内部数组中的下一个元素,增加索引,如果索引更大,则切换到外部数组中的下一个索引: 除了增加共享索引然后总结 arrays 的长度之外,我想不出 ...
共享内存 IPC 同步(无锁) 我的用例与上述问题中的描述非常接近。 但我想进一步使用用户定义的运行时大小动态创建 spsc 队列。 我尝试使用以下代码实现它: 但这会引发编译错误: 我可以理解它与分配器问题有关,但由于我对分配器的了解有限,我似乎无法解决它。 我该如何实施? ...
AFAIU 有一个普遍的想法,即无锁代码通常比锁定代码具有更高的开销。 虽然,似乎也有一种想法,即无锁算法在争用下更具可扩展性。 如果有 2 个内核和 2 个线程争用诸如std::queue (+ mutex) 与boost::lockfree::queue (MPMC 无锁队列) 之类的东西, ...
如果线程 2 首先在时间 t 更新 b,然后线程 3 在时间 t+5 更新 b: thread1 在读取 b 时会“及时”看到最新值吗? 例如:从 t+delta 到 t+5+delta 的读取应该是 true,在 t+5+delta 之后读取应该是 false。 delta 是线程 2 或 ...
我正在为单个生产者、多个消费者实现一个面向块的共享环形缓冲区。 缓冲区跟踪当前迭代(即换行计数)和最后写入的块索引。 写入时,生产者首先将块的迭代字段标记为脏,填充其他字段(偏移量/大小/等),然后将迭代字段标记为非脏,与整个缓冲区的迭代次数相同。 之后,它会适当地增加最后写入的块索引。 读取时, ...
例如,有共享变量。 原子布尔变量充当数据指示器。 线程 1 只设置这些变量。 线程 2 只获取这些变量。 我的问题是: 对于std::memory_order_seq_cst ,这是std::atomic_bool的默认值,在while (...) {}之后设置或获取共享变量是 ...
我将使用一个静态集合,它将被核心进程用于读取,并由后台服务每 X 分钟完全更新一次。 后台进程将每 X 分钟从数据库加载更新的数据,并将接收到的数据集设置到这个静态集合中。 核心进程将接收许多任务来检查此集合中是否存在某些值。 每个任务将在一个单独的线程中处理。 会有很多请求,它应该非常快,所以 ...
存在三种不同类型的“无锁”算法。 Concurrency in Action中给出的定义是: 无阻塞:如果所有其他线程都暂停,那么任何给定线程都将在有限步内完成其操作。 无锁:如果多个线程正在对一个数据结构进行操作,那么经过一定数量的步骤后,其中一个线程将完成其操作。 Wait-F ...
我对 java volatile read 有一个非常困惑的问题。 我将展示两个案例来解释我的问题。 情况1: class TestVolatile { public boolean running = true; public volatile boolean volatile ...
我指的是这个例子。 作者使用memory_order_release来递减计数器。 他们甚至在讨论部分state 中指出使用memory_order_acq_rel会过度。 但是理论上以下情况不会导致x永远不会被删除吗? 我们在不同的 CPU 上有两个线程他们每个人都拥有一个共享指针的实例,两个指 ...
cmpxchg的操作伪代码如下(Intel® 64 and IA-32 Architectures Software Developer's Manual, Volume 2A: Instruction Set Reference, AM, 2010): 至少乍一看,如果(且仅当) ZF = 0 ...
这个问题的灵感来自Lock-free Progress Guarantees 。 所示代码并非严格无锁。 每当写入线程在队列不为空或未满时挂起,读取线程就会返回 false,从而阻止整个数据结构取得进展。 真正无锁环形缓冲区的正确行为应该是什么? 通常,真正的无锁算法涉及一个阶段,在该阶段中,被抢 ...
鉴于以下情况: 读取m_value是否需要 memory 屏障? 我的理解是_InterlockedIncrement将生成一个完整的 memory 屏障,并确保在任何后续加载发生之前存储该值。 所以从这方面来看这听起来很安全,但是, m_value可以缓存,即GetValue()是否可以返回一个 ...