マルチスレッドプログラミングとスレッドセーフについて調べ始めたばかりです。私はビジー待機に精通しており、少し調査した結果、スピンロックの背後にある理論に精通しているので、Mac での OSSpinLock の実装を調べてみようと思いました。次の関数に要約されます (objc-os.h で定義)。
static inline void ARRSpinLockLock(ARRSpinLock *l)
{
again:
/* ... Busy-waiting ... */
thread_switch(THREAD_NULL, SWITCH_OPTION_DEPRESS, 1);
goto again;
}
thread_switch
少し掘り下げた後、のパラメーターが何をするかについてのおおよそのアイデアが得られました(このサイトは私が見つけた場所です)。私が読んだことの私の解釈は、thread_switch へのこの特定の呼び出しが次に利用可能なスレッドに切り替わり、現在のスレッドの優先度を 1 サイクルの絶対最小値に下げるというものです。「最終的に」(CPU 時間で) このスレッドは再びアクティブになりgoto again;
、ビジー待機を最初からやり直す命令をすぐに実行します。
私の質問ですが、なぜこの呼び出しが実際に必要なのですか? スピンロック (今回は Windows 用) の別の実装をここで見つけましたが、(Windows と同等の) スレッド切り替え呼び出しはまったく含まれていません。