有人问我,在给定无限内存的情况下,如何在不使用锁的情况下实现线程之间的并发。我尝试查找它,但找不到不使用任何锁的答案。这应该是可能的...
最佳答案
大多数现代 CPU 支持一组原子操作,可用于协调对无锁数据的访问(这些 CPU 指令通常用于实现锁定库函数)。例如,Sun Ultrasparcs 有一条比较与交换 (CAS) 指令:要使用它,您首先通常将内存地址读入 CPU 寄存器,然后计算所需的新值,然后使用 CAS - 指定原始值和新值;当且仅当内存内容仍然是原始值时,新值才会写入该内存。因此,这并不能阻止竞争条件导致更新尝试失败,但它可以让您检测到该失败,然后找出解决办法。通常,您会循环并重试 - 在计算新值并尝试更新时,首先读取其他线程写入该内存的任何值。
这可能有点令人困惑,所以让我们举一个更具体的例子。假设您需要计算所有线程完成的操作数 - 您可以在线程启动之前将计数器设置为 0,然后让每个线程使用 do { read/add-1/CAS } while (failure)
增加计数器的逻辑。
关于c++ - 线程间并发无锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14742726/