共有メモリについて – プログラミング – Home

通知
すべてクリア

共有メモリについて

固定ページ 1 / 2

T.T
 T.T
(@T.T)
ゲスト
結合: 19年前
投稿: 20
Topic starter  

お世話になります。

マッピングオブジェクトにより複数のプロセスがある変数に参照/更新を
行っているのですが、
セマフォなりクリティカルセッションを設けるのが当たり前なのでしょうか?

経験のある方よろしくお願い致します。


引用解決済
トピックタグ
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

> セマフォなりクリティカルセッションを設けるのが当たり前なのでしょうか?

読み/書きが交錯することによって困ったことが起こると危惧されるならば。

readers-writer-lockなんかが使われますふつー。


返信引用
T.T
 T.T
(@T.T)
ゲスト
結合: 19年前
投稿: 20
Topic starter  

おはよございます。
その変数を共有するDLLにおいて
Get/Setの関数がある場合は

//文字列設定
void __declspec(dllexport) __stdcall SetStr()
{
InitializeCriticalSection(&critSec);
strcpy(lp,p->command_A);
DeleteCriticalSection(&critSec);

}
//文字列取得
LPSTR __declspec(dllexport) __stdcall getStr()
{
return lp;
}

と書き込みにクリティカルセクションを行うのもなのですか?
επιστημη さんはどのように作成していらっしゃいますか?


返信引用
超初心者
 超初心者
(@超初心者)
ゲスト
結合: 23年前
投稿: 139
 

クリティカルセクションは別プロセスに使えないんじゃなかった。
クリティカルセクションを共有メモリに置けば出来そうなきもするが、
たぶん一般的にはやらないな。

ここはとりあえずミューテックス(資源1個のセマフォ)でしょ。
必要性があったらreaders-writer-lockでしょ。

SetStrの引数無いよ!

getStrにも排他制御が必要だよ。

それに直接ポインタを返してしまうのでは何も保護できていないことになる。
たとえば以下のようなことが出来てしまうのでだめ。
LPSTR p = getStr();
strcpy(lp,p->command_A); // おいおいSetStrを使わず書き換え出来ちゃうよ!

また、
LPSTR p = getStr();
// ここで別スレッドや別プロセスがSetStrを使うと
pの内容が書き換え途中なのでおかしなことになる。


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

横からすみません。
readers-writer-lockは、VCの場合にはNET Framework
しかないようですが........

T.Tさんは、ソ-スを見る限りでは、WIN32-APIもしくは、MFCで作ろうと
しているみたいですね。

マネージ・アンマネージすればいいのかな。


返信引用
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

r-w-lockって、アルゴリズムというかパターンの名前なんで、なければ実装するか(凝らなければ理
屈はそう難しくない)、汎用ライブラリを持ってくればいいだけです。
もちろん.NET持ってきても可。


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

そうなんですか。

「ミューテックス」と「クリティカルセクション」と「イベント」
は知っていましたが、「readers-writer-lock」
はこのスレではじめて知りました。

#共有するときは、お互いにかち合わないように考えているので。


返信引用
T.T
 T.T
(@T.T)
ゲスト
結合: 19年前
投稿: 20
Topic starter  

みなさんありがとうございます。

>ここはとりあえずミューテックス(資源1個のセマフォ)でしょ。
知りませんでした。再度勉強します。

>必要性があったらreaders-writer-lockでしょ。
readers-writer-lockは初めて聞くのですが、専門用語ですか?

>getStrにも排他制御が必要だよ。
了解です。

たびたびすみませんがお願い致します。


返信引用
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

> readers-writer-lockは初めて聞くのですが、専門用語ですか?

マルチスレッドで排他制御するときのパターンというか、定石みたいなものでしょうか。

http://www.google.com/search?
hl=ja&rls=en&q=readers+writer+lock+multithread+design+pattern++&&lr=en

読みたい人は複数いるけど、資源は一つ、同時に書けるのは一人っていうありがちな場合に、
読みたいだけの人全員が、毎回資源を排他占有してると効率悪いよね。
書き込みたいとき以外は、みんなで一緒に見ればいいじゃん。(かなり意訳)


返信引用
T.T
 T.T
(@T.T)
ゲスト
結合: 19年前
投稿: 20
Topic starter  

なるほどありがとうございます。
>readers-writer-lock
つまり書き込みの時だけ同期をとればいいわけですよね。
超初心者さんから
>getStrにも排他制御が必要だよ。
といわれたもので…。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

>> readers-writer-lock
> つまり書き込みの時だけ同期をとればいいわけですよね。

ちょと違う。

- 書いてる人も読んでる人もいなければ書いてよい。
- 書いてる人がいなければ(読んでる人がどれだけいても)読んでよい。


返信引用
T.T
 T.T
(@T.T)
ゲスト
結合: 19年前
投稿: 20
Topic starter  

>- 書いてる人も読んでる人もいなければ書いてよい。
>- 書いてる人がいなければ(読んでる人がどれだけいても)読んでよい。
そういうことですか。勉強になります。

もう一つ質問させてください。
私はdll側でクリティカルセクションを処理させておりました。
色々調べていましたが、dll側に組み込むのではなく読み書きするプロセス側で
ミューテックス等を行うのが正しいのでしょうか?

お手数ですがよろしくお願い致します。


返信引用
T.T
 T.T
(@T.T)
ゲスト
結合: 19年前
投稿: 20
Topic starter  

>- 書いてる人も読んでる人もいなければ書いてよい。
>- 書いてる人がいなければ(読んでる人がどれだけいても)読んでよい。
そういうことですか。勉強になります。

もう一つ質問させてください。
私はdll側でクリティカルセクションを処理させておりました。
色々調べていましたが、dll側に組み込むのではなく読み書きするプロセス側で
ミューテックス等を行うのが正しいのでしょうか?

お手数ですがよろしくお願い致します。


返信引用
REE
 REE
(@REE)
ゲスト
結合: 23年前
投稿: 240
 

複数のプロセスな時点で、クリティカルセクションではだめ。
DLLか、exeかという観点では、共有する変数を管理している側ですので、
話の流れから、DLLでしょう。


返信引用
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

> 私はdll側でクリティカルセクションを処理させておりました。

設計上、DLL をロードする各プロセス内で排他制御すればよいのなら、
DLL の作りにもよるでしょうが、問題ないと思います。

> マッピングオブジェクトにより複数のプロセスがある変数に参照/更新を行っているのですが、
ただし、この文章を見ている限り、排他制御はプロセス間で行う必要がありそうな気がします。
# プロセス間の排他制御が不要な設計なら問題ないですが、それは T.Tさんにしか分かりません。

既に書かれているように、もしもプロセス間で排他制御が必要なのであれば、
クリティカルセクションは「プロセス内での排他制御用」なのでうまく制御できません。
プロセス間の場合、ミューテクスが代替候補の筆頭になります。

この処理を、DLL でやるか呼び側でやるかは設計次第で、どちらが正しいということはないと思いま
す。

DLL 内の処理も各プロセスから呼ばれて各プロセスのコンテキストで動作するわけで、
プロセスとして見た場合、DLL 内に処理があろうと、呼び側に処理があろうと、
各プロセスでその処理を行っていることに変わりはありません。


返信引用
固定ページ 1 / 2

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました