1

TSET 是不可分割的机器代码指令,它可以做几件事。考虑其逻辑如下:

TSET(X)
if (x == 0) {
    x = 1;
    return true;
} else
    return false;

根据经典的操作系统教科书,它是线程同步所依赖的。信号量实现可能会使用它。因为它是不可分割的,所以即使在同一个 CPU 上发生不及时的线程切换时,它也可以用来保护临界区的入口。(我)已经很好地理解了它在单个CPU 上的使用。

这就是我缺乏硬件知识的地方:如果不同 CPU 上的两个竞争线程“同时”发出相同的 TSET(x) 怎么办。这让我问是否(以及如何)每个 CPU 的 fetch 执行周期是同步的。是不是 CPU1 上的一条指令发生,然后是 CPU2 上的一条指令,然后是 CPU1 上的一条指令?这是这样做的吗?我说得有道理吗?我回答了我自己的问题吗?

4

1 回答 1

0

x这个魔法指令应该是原子的/不可分割的,IOW,在它与 0 比较的时间和它设置为 1 的时间之间应该没有什么可以改变的。

这是它的全部意义。如果你仔细阅读你的书,你会看到一些糟糕的竞争条件的例子,其中类似的代码(读取/比较+修改)由于非原子性而惨遭失败(有这样的词吗?)。

你自己想想。

如果这条指令不是原子的,并且由于不幸的调度而按此顺序执行了 2 个并发线程/进程,会发生什么?:

1: if (x==0)
2: if (x==0)
1: x=1, return true
2: x=1, return true

两个线程/进程都会认为他们已经获得了对该锁变量x保护访问的某个对象的独占访问权。不好。

于 2012-10-13T14:15:14.553 回答