我被问到如何在不使用锁的情况下实现线程之间的并发,给定无限的内存。我尝试查找它但找不到不使用任何锁的答案。这应该是可能的......
答案 0 :(得分:1)
大多数现代CPU支持一组原子操作,这些操作可用于协调对数据的访问而不需要锁(这些CPU指令通常用于实现锁定库函数)。例如,Sun Ultrasparcs有一个比较和交换(CAS)指令:要使用它,首先通常将内存地址读入CPU寄存器,然后计算所需的新值,然后使用CAS - 指定原始值和新值;当且仅当内存内容仍然是原始值时,新值才会被写入该内存。因此,这不会阻止竞争条件导致您的更新尝试失败,但它可以让您检测到该故障,然后确定如何处理它。通常,您循环并再次尝试 - 在计算新值并尝试更新时,首先读取其他线程写入该内存的任何值。
这可能有点令人困惑,所以让我们举一个更具体的例子。假设您需要计算所有线程完成的操作数 - 您可以在线程开始之前将计数器设置为0,然后让每个线程使用do { read/add-1/CAS } while (failure)
逻辑来递增计数器。
答案 1 :(得分:0)
答案 2 :(得分:0)
您可以查看软件事务内存(STM)。线程可以通过可以检查冲突的事务来更新共享内存,而不是锁定。