我被问到如何在不使用锁的情况下实现线程之间的并发,给定无限的内存。我尝试查找它,但找不到不使用任何锁的答案。这应该是可能的...
问问题
1501 次
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 回答