私はスレッドについて学び始めました、そして今、本が私をユーザーレベルとカーネルレベルのスレッドと混同するところまで来ています。
この本は違いを強調し、問題を提示しています。次の2つの類似したコードの出力は異なりますが、(私の知る限り)それらの出力は私には同じように見えます。
1つ目は、ユーザーレベルのスレッドに関するものです。
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 ++は1回だけ実行する必要があり、これら2回の実行後に出力が出力されるため、出力は0でなければなりません。
2番目のケースは、カーネルレベルのスレッドに関するものです。
int number = 0;
t1() {number--}
t2() {number++}
main() {
createThread(pass t1)
createThread(pass t2)
wait till both complete
print number
}
この場合、同じことですが、カーネルは2つのスレッドを作成します。1つは-、もう1つは++であるため、両方を1回だけ実行する必要があります。結果は再び0でなければなりません。
しかし、本は出力が異なる、または介入のために異なる出力があるかもしれないと言っています、誰かが理由を教えてもらえますか?