人们经常说"写无锁程序很难","编写正确的无锁程序更难","当你进行并发编程时,你需要以交易的方式思考。"
交易究竟意味着什么?
我理解在执行程序时,操作系统调度程序可能让程序多次进入和退出CPU,并且调度程序暂停程序的确切代码位置是不确定的,这使得并发编程变得困难,因为几个线程之间的执行流程可以以各种方式交错。
事务是指单个CPU指令还是在同一个CPU条目中执行的指令?例如,在以下代码中
x = x1 + x2 + x3;
是否可能在一个CPU条目中计算x1 + x2
,并且在另一个CPU条目中计算(temporary for the sum of x1, x2) + x3
的添加,并且=
到x
的赋值是在第三个CPU条目中完成?
答案 0 :(得分:1)
就像在数据库中一样。一些指令,只能在不中断的情况下一次执行(如)。 '原子操作'是另一个名字。 https://www.threadingbuildingblocks.org/docs/help/tbb_userguide/Atomic_Operations.htm
关于如何实现交易没有严格的规定。最直接的方法是锁定。 无法保证CPU单元。所以实际的答案是 - 是的,它是可能的(或者至少你应该这样对待它)。并且相同的CPU仍然不能保证任何东西,因为单个CPU单元机器上的线程地狱大致相同。
答案 1 :(得分:1)
事务,应用程序级别的概念,指的是所谓的原子操作。
它与数据库事务的概念相同,数据库通过执行从多个并行会话中串行收集的事务来保持一致性。
在CPU级别,还有处理更新内存的原子操作(通常不称为事务)。说明本身可以被打断。复杂指令可以读取内存,对其执行操作,然后将其写回。 cmpxchg
)指令读取内存,将其与寄存器值进行比较,并有条件地将其写回。内存可能由另一个CPU同时更改。一个特殊的操作码前缀,其助记符为LOCK
,可防止其他CPU进行此类修改。
是的,语句x = x1 + x2 + x3
可能跨3个CPU执行,但实际上这不会发生,因为调度程序传输一个应用程序线程会导致性能下降到另一个CPU。此外,必须在几个CPU时钟周期内发生3次中断。
答案 2 :(得分:0)
一个事务是一个全有或全无的操作,要么你一直成功,要么一切就好像它从未发生过就数据的状态而言。
如果您有银行交易,最好确保从您的帐户中提取的内容到达目标收件人或没有任何结果。 如果您的账户变为负数且银行停止提款,它也应该在另一端停止存款,否则将会有一些最终在银行底线丢失的$$$。