mutexについて

[戻る]
てんてん 2012/07/10(火) 23:43:11
スレッド間の排他でmutexを使えると思うのですが、
どうやって確実に排他をしているのでしょうか?

たとえば
スレッドAとスレッドBがあるとします。
物理コアが2つ以上あり、各スレッドはコアが分かれているとします。
こういう場合は、本当にスレッドは並列に処理されるのですよね?
スレッドAとスレッドBでジャストなタイミングで、同一のmutexに
waitforでロックをかけた場合、どういう理屈で不整合が起こらないように
なっているのでしょうか?

想像として
・CPUへのバスが1本だから大丈夫なのか?
・キューイングしているから大丈夫なのか?(この場合はキューイングの際の排他が気にな
りますが。。。)

VC++とはあんまり関係なかもしれませんが、こちらで質問させていただきます。

瀬戸っぷ [E-Mail] 2012/07/11(水) 01:18:23
OS内部の同期オブジェクトを扱う処理を1つのコア(というかスレッド?)で行うようにする。
とか………。
システムコールに入ったら、リソースの競合などもあるので他のスレッドは待機状態にな
る…とか。


Windowsではカーネルのコードは観れませんから…Linuxカーネルのコード追ってみるとか。

tetrapod 2012/07/11(水) 06:34:57
この辺の「ロック」機構について正しく理解するには、
キャッシュ無効化とかメモリバリアとか
そっち系の 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 と同等のロック機構を使っているはず。

仲澤@失業者 2012/07/11(水) 10:15:49
ハード的にどのような仕組みになっているのかは知りませんので、
別な側面から考えて見ます。

まず第一に、CPU内のコアがいくつであろうと、単体で
無矛盾に動作しなければ実用になりません。

原則として、複数コアのCPUが無矛盾に動くためには。
 1.コア間の調整が必要です(本質的に勝手な動きはできません)。
 2.全コアが対象とする入出力は唯一でなければなりません。
ですね。
つまり排他については「できてあたりまえ」、別の言い方をすると、
無ければ実用にならないわけです。

ネットワークでつながれた複数のPCで、唯一の作業を
分担して行わせるには、どのような仕組みが必要かを考えてみると
わかりやすいかもしれませんね。

古いスレッドには追加発言できません。