我开始学习线程,现在我明白这本书让我对用户级和内核级线程感到困惑。
这本书非常强调差异并提出了一个问题,说以下两个相似代码的输出是不同的,但是(据我所知),它们的输出对我来说似乎是相同的。
第一个是关于用户级线程:
int number = 0;
int main() {
fork()
if it is child {number--, return 0}
if it is parent {number++, wait till child return, print number}}
我的分析是由于 number-- 和 number++ 只需要执行一次,并且执行完这两次后会打印输出,所以输出必须为 0。
第二种情况是关于内核级线程:
int number = 0;
t1() {number--}
t2() {number++}
main() {
createThread(pass t1)
createThread(pass t2)
wait till both complete
print number
}
在这种情况下,同样的事情,内核创建了两个线程,一个 --,另一个 ++,所以它们都只需要执行一次。并且结果必须再次为 0。
但是,书上说输出是不同的,或者由于干预可能会有不同的输出,谁能告诉我为什么?