プロが教えるわが家の防犯対策術!

共有メモリを持つDLLを作りました
機能は単純です
(1)カウンターをアップしてその値を返す ⇒ CountUp()
(2)カウンターの現在値を返す ⇒ TotalCount()

#pragma data_seg(".HShared")
static int m = 0;
#pragma data_seg()
#pragma comment(linker,"/Section:.HShared,rws")
int WINAPI DllMain(HINSTANCE hInst, DWORD fdwReason, PVOID pvReserved)
{
return TRUE;
}
EXPORT int CALLBACK CountUP()
{
m++;
return m;
}
EXPORT int CALLBACK TotalCount()
{
return m;
}

このDLLは多数のアプリから呼ばれます
当然同時に呼ばれることもあるでしょう
カウンター m には排他処理を施してありません
大丈夫でしょうか?
それとも排他は Windows様 がしてくれているのでしょうか?

色々と調べてみましたが良く分かりません
宜しくご教授お願い申し上げます

A 回答 (3件)

OSは排他制御してくれません。



書かれているような単純なオブジェクトであれば、
おそらく問題にはならないと思います。が、
排他が必要かどうかはオブジェクトにアクセスする
呼び出し側の設計に依存します。

排他制御が必要かどうかは
シーケンス図を書けばわかりやすいです。
    • good
    • 0
この回答へのお礼

ありがとうございます

『OSは排他制御してくれません』 ← これが分かれば決心が付きました

自分で排他します → 但し、私デッドロックさせる名人なのがぁ~~

ありがとうございました

お礼日時:2011/07/08 09:55

Win32API のミューテックス や セマフォー 辺りを調べる


と色々、説明があると思います。

http://msdn.microsoft.com/ja-jp/library/cc429064 …
http://msdn.microsoft.com/ja-jp/library/cc429076 …
    • good
    • 0
この回答へのお礼

ありがとうございます

排他を自分でやることに致しましたので参考にさせて頂きます

これからも色々とお世話になると思います

宜しくご指導尾お願い申し上げます

ありがとうございました

お礼日時:2011/07/08 10:01

例えば



EXPORT int CALLBACK CountUP()
{
m++;
←ここで別アプリに切り替わってCountUPが呼ばれたらどうなるでしょう?
return m;
}

あるいは
実際にはCの命令単位ではなく、コンパイルされた機械語単位で動作するのですから
m++ が次のようなコードになった場合
A←m ;/* AはCPUの演算用レジスタ */
A←A+1;
←ここで別アプリでCountUPが最後まで実行されてから戻ってきたらどうなるでしょう
m←A;
    • good
    • 0
この回答へのお礼

ありがとうございます

とても良くわかりました

今後とも宜しくお願い申し上げます

ありがとうございました

お礼日時:2011/07/08 09:57

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!