-1

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

4

3 回答 3

1

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

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

于 2013-02-07T02:59:44.867 回答
0

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

于 2013-02-07T03:11:41.220 回答
0

如果线程要么:

  • 不要共享任何数据或
  • 共享数据,但只从共享的数据中读取而不写入。

但是,一旦写入共享数据,事情就会变得复杂。这是您需要开始阅读的地方

于 2013-02-07T03:06:50.787 回答