没有锁的线程之间的并发?

时间:2013-02-07 02:52:49

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

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

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

完全可能且非常简单,只要提供线程:

  • 不要共享任何数据 OR
  • 共享数据,但只读取共享数据并且不写入数据。

然而,一旦写入共享数据,事情变得复杂。您需要start reading up

答案 2 :(得分:0)

您可以查看软件事务内存(STM)。线程可以通过可以检查冲突的事务来更新共享内存,而不是锁定。