std::mutex は、Windows上のマルチプロセス環境でも機能する?

[戻る]
ぶた 2016/02/06(土) 17:15:40
タイトルのお尋ねをさせて頂けないでしょうか。自己調査で行き詰まってしまい膨大な時間がかかりそうだった為、既にご存知の片を頼らせて頂こうと思った次第です。
下記が詳細です。推測でなく、確かな情報をお教え頂けると幸いです。恐れ入りますが、何卒宜しくお願い申し上げます。

【概要】
VC++のstd::mutexの実装は、下記のどれかが使われていると思われる。が、調べきれず断念せざるを得なかった。

A. InitializeCriticalSection() + CRITICAL_SECTION を使った、軽量(高速)ミューテックス( 同一プロセス内の複数スレッド間でのみ、排他制御を行える同期プリミティブ )
B. CreateMutex[Ex]() を使った、通常ミューテックス( 複数プロセスを跨いで、排他制御を行える同期プリミティブ )

std::mutexをマルチプロセスのコードで使いたいので、CreateMutex()を使った実装である証拠を掴みたい。

【調べた事】
・VS2015 VC++ の std::mutex を使う試験コードを書いてデバッガのステップ実行で追うも、__imp___Mtx_lock という msvcp140d.dll にあるCリンケージの内部関数を呼び出す所で、アセンブリコードの追跡に力尽きた。

・"std::mutex" "マルチプロセス" の単語で、ここや他のHPを調べるも、目的の情報に辿り着けなかった。

【環境】
・Win7.1 x64
・VS2015 VC++ Pro. で、x64のデバッグバイナリを吐くようビルド

瀬戸っぷ [E-Mail] 2016/02/08(月) 09:27:43
>__imp___Mtx_lock という msvcp140d.dll にあるCリンケージの内部関数を呼び出す所で

最新のVC++の製品版は持っていませんが…
インストール時にCランタイムライブラリのソースはインストールできませんでしたか?
# 手持ちの製品版はVS2005Stdだからなぁ……。

Visual Studio 2015 Communityで、
Microsoft Visual Studio 14.0\VC\crt\src\stl\mutex.c
にソレっぽいソースがありますな。
GetCurrentThreadId()だとかWAIT_OBJECT_0だとか出てくるようなので、
>B. CreateMutex[Ex]() を使った、通常ミューテックス( 複数プロセスを跨いで、排他制
御を行える同期プリミティブ )
こっちっぽい雰囲気がありますが。

瀬戸っぷ [E-Mail] 2016/02/08(月) 09:32:13
………訂正。

mtx->_get_cs()->lock();
なんてコードがあるので、
>A. InitializeCriticalSection() + CRITICAL_SECTION を使った、軽量(高速)ミュー
テックス( 同一プロセス内の複数スレッド間でのみ、排他制御を行える同期プリミティブ )
の可能性があるかも。
# ただ、InitializeCriticalSectionでgrepすると引っかかるのは別のソースだったりす
るが。

まあ、いずれにしろソースはある…っぽいので調べてみてください。
Concurrency::details::stl_critical_section_interface
とかあるみたいですけど。

ぶた 2016/04/05(火) 10:05:42
[[解決]]
結論は「 機能しない 」でした。

SRWLOCK系( ≒ Vistaからkernel32.dllに加わった、CRITICAL_SECTION系の高速版 )を使ってい
る事を、突き止めた為です。

どうも有難うございました。

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