スレッド間の排他でmutexを使えると思うのですが、
どうやって確実に排他をしているのでしょうか?
たとえば
スレッドAとスレッドBがあるとします。
物理コアが2つ以上あり、各スレッドはコアが分かれているとします。
こういう場合は、本当にスレッドは並列に処理されるのですよね?
スレッドAとスレッドBでジャストなタイミングで、同一のmutexに
waitforでロックをかけた場合、どういう理屈で不整合が起こらないように
なっているのでしょうか?
想像として
・CPUへのバスが1本だから大丈夫なのか?
・キューイングしているから大丈夫なのか?(この場合はキューイングの際の排他が気にな
りますが。。。)
VC++とはあんまり関係なかもしれませんが、こちらで質問させていただきます。
OS内部の同期オブジェクトを扱う処理を1つのコア(というかスレッド?)で行うようにする。
とか………。
システムコールに入ったら、リソースの競合などもあるので他のスレッドは待機状態にな
る…とか。
Windowsではカーネルのコードは観れませんから…Linuxカーネルのコード追ってみるとか。
この辺の「ロック」機構について正しく理解するには、
キャッシュ無効化とかメモリバリアとか
そっち系の hardware に関する知識が無いと理解できないんだが・・・
x86 に関して言えば lock xchg [mem],reg という命令があって、
これが atomic に実行されることがハードウエア側で保証されている。
atomic とは [同一 CPU 内部の他のコア] や [smp 下での別 CPU] などが
同時に命令を実行しようとしても、邪魔されないということ。
Linux の場合の spinlock の解説例とか
http://hira-consulting.com/wiki/index.php?lkc2005_11_10_slkn01
hardware は同一なわけで windows でも linux と同等のロック機構を使っているはず。
ハード的にどのような仕組みになっているのかは知りませんので、
別な側面から考えて見ます。
まず第一に、CPU内のコアがいくつであろうと、単体で
無矛盾に動作しなければ実用になりません。
原則として、複数コアのCPUが無矛盾に動くためには。
1.コア間の調整が必要です(本質的に勝手な動きはできません)。
2.全コアが対象とする入出力は唯一でなければなりません。
ですね。
つまり排他については「できてあたりまえ」、別の言い方をすると、
無ければ実用にならないわけです。
ネットワークでつながれた複数のPCで、唯一の作業を
分担して行わせるには、どのような仕組みが必要かを考えてみると
わかりやすいかもしれませんね。