c++ - 线程间并发无锁?

标签 c++ c multithreading operating-system thread-safety

有人问我,在给定无限内存的情况下,如何在不使用锁的情况下实现线程之间的并发。我尝试查找它,但找不到不使用任何锁的答案。这应该是可能的...

最佳答案

大多数现代 CPU 支持一组原子操作,可用于协调对无锁数据的访问(这些 CPU 指令通常用于实现锁定库函数)。例如,Sun Ultrasparcs 有一条比较与交换 (CAS) 指令:要使用它,您首先通常将内存地址读入 CPU 寄存器,然后计算所需的新值,然后使用 CAS - 指定原始值和新值;当且仅当内存内容仍然是原始值时,新值才会写入该内存。因此,这并不能阻止竞争条件导致更新尝试失败,但它可以让您检测到该失败,然后找出解决办法。通常,您会循环并重试 - 在计算新值并尝试更新时,首先读取其他线程写入该内存的任何值。

这可能有点令人困惑,所以让我们举一个更具体的例子。假设您需要计算所有线程完成的操作数 - 您可以在线程启动之前将计数器设置为 0,然后让每个线程使用 do { read/add-1/CAS } while (failure) 增加计数器的逻辑。

关于c++ - 线程间并发无锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14742726/

相关文章:

c - 将 4 位整数除以 2 位整数并通过 c 计算

用于 mailto url 解析的 C API

c++ - 具有没有任何构造函数的标准布局结构的 RVO

c++ - 我在哪里可以找到世界上最快的 atof 实现?

c++ - 线程池对英特尔线程构建模块有用吗?

c# - Thread.Sleep(0) 在 .NET Core 3.1 上没有按预期工作

multithreading - 在 Kotlin 中使用线程还是协程更好?

c++ - 如何在 lambda 捕获列表中创建指针?

c++ - 合并 const 和非常量 std::list 的模板特化

c++ - 使部分代码中的变量不可用