【发布时间】:2012-05-31 03:10:31
【问题描述】:
我已经阅读了两个完全不同的关于 STM 是如何实现的说明。也许两者都是有效的,或者一个是错误的,我希望有人能解释一下。
Take 1(维基百科):所有线程都可以修改共享内存,但事务中的每次读取和写入都会被记录。在事务结束时,系统检查其他线程是否没有同时对内存进行更改。如果未进行任何更改,则提交事务。否则,事务重新开始。
- 问:如果这是一个有效的实现,那么允许两个线程在同一个事务中执行似乎没有用。它们将读取彼此的写入,并且事务块内的计算将出现错误。
Take 2(找不到源):当程序进入事务时,它会获取其中包含的所有变量的副本,并且可以对它们进行访问。在事务结束时,系统尝试用副本更新主控。如果自第一次复制后 master 没有更改,则提交事务。否则,事务重新开始。
另外,当两个线程同时进入同一个事务时会发生什么?这不会导致某种竞争条件吗?由于两者都试图修改相同的共享内存,因此两者都需要重新启动并且问题会无限期地继续下去,除非系统介入并告诉一个线程对其进行冷却(有点像锁=)我确定我是这里缺少一个概念。
【问题讨论】:
标签: transactions multicore stm