cost 71 ms
在 GNU C 内联汇编中输入操作数 `"m"(var)` 和 Output 操作数 `"=m"(var)`? 在没有说明的情况下用作障碍? - Input Operand `"m"(var)` and Output Operand `"=m"(var)` in GNU C inline asm? Used with no instructions as barriers?

我想知道asm中的输入操作数"m"(var)和 output 操作数"=m"(var)是做什么的: 我在 SPMC 队列中遇到了上面 的两行。 副作用是什么? 上面的行没有 asm 指令,所以我相信作者试图利用一些明确定义的副作用(例如,如果write_idx和blk的值在第二行,它们会被寄存器刷 ...

以下为可重入锁编写的代码是否容易受到指令重新排序错误的影响? - Could the following code written for a Reentrant Lock be susceptible to an instruction reordering error?

我最近在学习无锁并发中的可重入锁时遇到了以下代码: 但是,我不确定释放栅栏调用是否不排除在它之前的线程中进行后续 memory 操作的可能性,以及获取栅栏是否排除在它之后进行更早的 memory 操作的可能性。 如果他们不这样做,从技术上讲,优化可能会导致这条线吗? 在调用之前在同一线程上完成并成 ...

如何在没有锁定的情况下在特定时间获得稳定版本的多个值? - How to get a stable version of mutiple values at a particular time without lock?

我正在阅读 ConcurrentQueue 的源代码,这里有一些代码: GetHeadTailPositions() 可能想要在特定时间获取 4 个变量,但是,在“where”循环中有 4 个比较,考虑以下序列: 然后我们得到这些变量的不稳定版本。 这个方法稳定吗? 如何在没有锁定的情况下在特定 ...

C++ 中没有分配的字符串的共享 memory SPSC 队列 - Shared memory SPSC queue for strings without allocations in C++

赏金将在 7 小时后到期。 此问题的答案有资格获得+50声望赏金。 madhur4127想提请更多人注意这个问题: 这是一个小众问题,所以是的,这值得赏金我正在寻找类似于由boost::lockfree::spsc_queue和boost::interprocess提供的 SHM(共享内存)SP ...

获取/发布最新操作的可见性 - Acquire/Release Visibility of Latest Operation

赏金将在 5 天后到期。 此问题的答案有资格获得+50声望赏金。 Yam Marcovic正在从可靠的来源寻找答案: C++ 标准或 CppReference 的摘录在这里清楚地得出了可靠的结论,如果可能的话要简明扼要。 这个主题有很多微妙之处,需要筛选的信息也很多。 我找不到专门解决这个问题 ...

当你在没有保护的情况下从多个线程读写一个 object 会发生什么? - What happens when you read and write an object from multiple threads without protection?

我了解到从不同的线程访问相同的 Object 不是线程安全的,应该受到保护。 通过锁定或“Interlocked.Exchange”或不可变或任何其他方式。 这意味着以下代码可能不是线程安全的,因为它不保护对共享“测试”object 的访问。 我的问题是: 以下代码是否安全? 如果不是,可能发生的 ...

多个生产者消费者的并发数据结构,其中每个消费者读取每个数据 - Concurrent data structure for multiple producer consumer where every consumer reads each datum

我需要为以下场景构建数据结构。 有多个生产者,他们需要向消费者发送数据。 有多个消费者,他们需要从生产者那里接收数据到目前为止,这是非常典型的mpmc队列用例。 但是,我还有一个限制。 每个消费者都必须能够读取生产者发送的所有数据。 当然,某些消费者必须能够读取第二个或第三个元素,而其他消费者读取第 ...

无锁迭代/索引锯齿状 arrays - Lock free iterating / indexing jagged arrays

对于加速数据结构上的并行工作,我目前使用SpinLock ,但想设计无锁算法。 数据结构是一个锯齿状数组,其中每个内部数组都有不同的大小。 工作线程应该获取内部数组中的下一个元素,增加索引,如果索引更大,则切换到外部数组中的下一个索引: 除了增加共享索引然后总结 arrays 的长度之外,我想不出 ...

在具有运行时大小的 boost 托管共享 memory 中创建 boost::spsc 队列 - Create boost::spsc queue in boost managed shared memory with a runtime size

共享内存 IPC 同步(无锁) 我的用例与上述问题中的描述非常接近。 但我想进一步使用用户定义的运行时大小动态创建 spsc 队列。 我尝试使用以下代码实现它: 但这会引发编译错误: 我可以理解它与分配器问题有关,但由于我对分配器的了解有限,我似乎无法解决它。 我该如何实施? ...

当核心数量很大时,无锁算法是否倾向于优于锁定算法? - Do lock-free algorithms tend to outperform locking ones when the number of cores is large?

AFAIU 有一个普遍的想法,即无锁代码通常比锁定代码具有更高的开销。 虽然,似乎也有一种想法,即无锁算法在争用下更具可扩展性。 如果有 2 个内核和 2 个线程争用诸如std::queue (+ mutex) 与boost::lockfree::queue (MPMC 无锁队列) 之类的东西, ...

在 SPMC 队列中混合 memory 排序 memory_order_seq_cst 和 memory_order_relaxed? - Mixing memory ordering memory_order_seq_cst and memory_order_relaxed in a SPMC queue?

我正在为单个生产者、多个消费者实现一个面向块的共享环形缓冲区。 缓冲区跟踪当前迭代(即换行计数)和最后写入的块索引。 写入时,生产者首先将块的迭代字段标记为脏,填充其他字段(偏移量/大小/等),然后将迭代字段标记为非脏,与整个缓冲区的迭代次数相同。 之后,它会适当地增加最后写入的块索引。 读取时, ...

我应该使用哪个集合从多个线程中读取元素并定期完全覆盖集合? - Which collection should I use it to read elements from multiple threads and full overwrite collection periodically?

我将使用一个静态集合,它将被核心进程用于读取,并由后台服务每 X 分钟完全更新一次。 后台进程将每 X 分钟从数据库加载更新的数据,并将接收到的数据集设置到这个静态集合中。 核心进程将接收许多任务来检查此集合中是否存在某些值。 每个任务将在一个单独的线程中处理。 会有很多请求,它应该非常快,所以 ...

无锁的定义 - The definition of lock-free

存在三种不同类型的“无锁”算法。 Concurrency in Action中给出的定义是: 无阻塞:如果所有其他线程都暂停,那么任何给定线程都将在有限步内完成其操作。 无锁:如果多个线程正在对一个数据结构进行操作,那么经过一定数量的步骤后,其中一个线程将完成其操作。 Wait-F ...

提升原子引用计数示例是否包含错误? - Does boost atomic reference counting example contain a bug?

我指的是这个例子。 作者使用memory_order_release来递减计数器。 他们甚至在讨论部分state 中指出使用memory_order_acq_rel会过度。 但是理论上以下情况不会导致x永远不会被删除吗? 我们在不同的 CPU 上有两个线程他们每个人都拥有一个共享指针的实例,两个指 ...

真正的无锁 MPMC 环形缓冲区? 线程可以互相协助避免阻塞吗? - Truly Lock-free MPMC Ring Buffer? Threads able to assist each other to avoid blocking?

这个问题的灵感来自Lock-free Progress Guarantees 。 所示代码并非严格无锁。 每当写入线程在队列不为空或未满时挂起,读取线程就会返回 false,从而阻止整个数据结构取得进展。 真正无锁环形缓冲区的正确行为应该是什么? 通常,真正的无锁算法涉及一个阶段,在该阶段中,被抢 ...

读取原子修改的值是否需要 memory 屏障? - Is a memory barrier required to read a value that is atomically modified?

鉴于以下情况: 读取m_value是否需要 memory 屏障? 我的理解是_InterlockedIncrement将生成一个完整的 memory 屏障,并确保在任何后续加载发生之前存储该值。 所以从这方面来看这听起来很安全,但是, m_value可以缓存,即GetValue()是否可以返回一个 ...


 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM