TSET是不可分割的机器代码指令,可以执行多项操作。考虑其逻辑如下:
TSET(X)
if (x == 0) {
x = 1;
return true;
} else
return false;
根据经典的OS教科书,它依赖于线程同步。信号量实现可能会使用它。因为它是不可分割的,所以即使在同一CPU上发生不合时宜的线程切换,它也可用于保护进入关键部分的入口。它在单个 CPU上的使用已经很好地理解了(我)。
这里缺少我的硬件知识:如果不同CPU上的两个竞争线程同时发出相同的TSET(x)和#34;该怎么办"。这让我想知道每个CPU的获取执行周期是否(以及如何)同步。是不是CPU1上的指令发生了,然后是CPU2再指令CPU1?这是怎么做的?我有道理吗?我回答了自己的问题吗?
答案 0 :(得分:0)
这个神奇的指令应该是原子/不可分割的,IOW,在与0比较的时间和设置为1的时间之间,任何东西都不能改变x
。
这是它的全部意义。如果你仔细阅读你的书,你会看到不良竞争条件的例子,其中类似的代码(阅读/比较+修改)由于非原子性而失败(是否有这样的词?)。
自己想一想。
如果这条指令不是原子的,并且由于不幸的调度而按此顺序执行了2个并发线程/进程,会发生什么?:
1: if (x==0)
2: if (x==0)
1: x=1, return true
2: x=1, return true
两个线程/进程都认为他们已获得对此锁定变量x
保护访问权限的某个对象的独占访问权限。不好。