お世話になります。
マッピングオブジェクトにより複数のプロセスがある変数に参照/更新を
行っているのですが、
セマフォなりクリティカルセッションを設けるのが当たり前なのでしょうか?
経験のある方よろしくお願い致します。
> セマフォなりクリティカルセッションを設けるのが当たり前なのでしょうか?
読み/書きが交錯することによって困ったことが起こると危惧されるならば。
readers-writer-lockなんかが使われますふつー。
おはよございます。
その変数を共有するDLLにおいて
Get/Setの関数がある場合は
//文字列設定
void __declspec(dllexport) __stdcall SetStr()
{
InitializeCriticalSection(&critSec);
strcpy(lp,p->command_A);
DeleteCriticalSection(&critSec);
}
//文字列取得
LPSTR __declspec(dllexport) __stdcall getStr()
{
return lp;
}
と書き込みにクリティカルセクションを行うのもなのですか?
επιστημη さんはどのように作成していらっしゃいますか?
クリティカルセクションは別プロセスに使えないんじゃなかった。
クリティカルセクションを共有メモリに置けば出来そうなきもするが、
たぶん一般的にはやらないな。
ここはとりあえずミューテックス(資源1個のセマフォ)でしょ。
必要性があったらreaders-writer-lockでしょ。
SetStrの引数無いよ!
getStrにも排他制御が必要だよ。
それに直接ポインタを返してしまうのでは何も保護できていないことになる。
たとえば以下のようなことが出来てしまうのでだめ。
LPSTR p = getStr();
strcpy(lp,p->command_A); // おいおいSetStrを使わず書き換え出来ちゃうよ!
また、
LPSTR p = getStr();
// ここで別スレッドや別プロセスがSetStrを使うと
pの内容が書き換え途中なのでおかしなことになる。
横からすみません。
readers-writer-lockは、VCの場合にはNET Framework
しかないようですが........
T.Tさんは、ソ-スを見る限りでは、WIN32-APIもしくは、MFCで作ろうと
しているみたいですね。
マネージ・アンマネージすればいいのかな。
r-w-lockって、アルゴリズムというかパターンの名前なんで、なければ実装するか(凝らなければ理
屈はそう難しくない)、汎用ライブラリを持ってくればいいだけです。
もちろん.NET持ってきても可。
そうなんですか。
「ミューテックス」と「クリティカルセクション」と「イベント」
は知っていましたが、「readers-writer-lock」
はこのスレではじめて知りました。
#共有するときは、お互いにかち合わないように考えているので。
みなさんありがとうございます。
>ここはとりあえずミューテックス(資源1個のセマフォ)でしょ。
知りませんでした。再度勉強します。
>必要性があったらreaders-writer-lockでしょ。
readers-writer-lockは初めて聞くのですが、専門用語ですか?
>getStrにも排他制御が必要だよ。
了解です。
たびたびすみませんがお願い致します。
> readers-writer-lockは初めて聞くのですが、専門用語ですか?
マルチスレッドで排他制御するときのパターンというか、定石みたいなものでしょうか。
http://www.google.com/search?
hl=ja&rls=en&q=readers+writer+lock+multithread+design+pattern++&&lr=en
読みたい人は複数いるけど、資源は一つ、同時に書けるのは一人っていうありがちな場合に、
読みたいだけの人全員が、毎回資源を排他占有してると効率悪いよね。
書き込みたいとき以外は、みんなで一緒に見ればいいじゃん。(かなり意訳)
なるほどありがとうございます。
>readers-writer-lock
つまり書き込みの時だけ同期をとればいいわけですよね。
超初心者さんから
>getStrにも排他制御が必要だよ。
といわれたもので…。
>> readers-writer-lock
> つまり書き込みの時だけ同期をとればいいわけですよね。
ちょと違う。
- 書いてる人も読んでる人もいなければ書いてよい。
- 書いてる人がいなければ(読んでる人がどれだけいても)読んでよい。
>- 書いてる人も読んでる人もいなければ書いてよい。
>- 書いてる人がいなければ(読んでる人がどれだけいても)読んでよい。
そういうことですか。勉強になります。
もう一つ質問させてください。
私はdll側でクリティカルセクションを処理させておりました。
色々調べていましたが、dll側に組み込むのではなく読み書きするプロセス側で
ミューテックス等を行うのが正しいのでしょうか?
お手数ですがよろしくお願い致します。
>- 書いてる人も読んでる人もいなければ書いてよい。
>- 書いてる人がいなければ(読んでる人がどれだけいても)読んでよい。
そういうことですか。勉強になります。
もう一つ質問させてください。
私はdll側でクリティカルセクションを処理させておりました。
色々調べていましたが、dll側に組み込むのではなく読み書きするプロセス側で
ミューテックス等を行うのが正しいのでしょうか?
お手数ですがよろしくお願い致します。
複数のプロセスな時点で、クリティカルセクションではだめ。
DLLか、exeかという観点では、共有する変数を管理している側ですので、
話の流れから、DLLでしょう。
> 私はdll側でクリティカルセクションを処理させておりました。
設計上、DLL をロードする各プロセス内で排他制御すればよいのなら、
DLL の作りにもよるでしょうが、問題ないと思います。
> マッピングオブジェクトにより複数のプロセスがある変数に参照/更新を行っているのですが、
ただし、この文章を見ている限り、排他制御はプロセス間で行う必要がありそうな気がします。
# プロセス間の排他制御が不要な設計なら問題ないですが、それは T.Tさんにしか分かりません。
既に書かれているように、もしもプロセス間で排他制御が必要なのであれば、
クリティカルセクションは「プロセス内での排他制御用」なのでうまく制御できません。
プロセス間の場合、ミューテクスが代替候補の筆頭になります。
この処理を、DLL でやるか呼び側でやるかは設計次第で、どちらが正しいということはないと思いま
す。
DLL 内の処理も各プロセスから呼ばれて各プロセスのコンテキストで動作するわけで、
プロセスとして見た場合、DLL 内に処理があろうと、呼び側に処理があろうと、
各プロセスでその処理を行っていることに変わりはありません。