人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

セマフォの基本的な質問なのですが、intのグローバル変数Xを
タスクAで読み書き、タスクBがそれを読むとします。
この時、双方のタスクでセマフォでの保護は必要でしょうか?
(タスクBは、読むだけです)
(OSは、Winに限定しません)


●質問者: suzume_oyado
●カテゴリ:コンピュータ
✍キーワード:OS WIN グローバル変数 セマフォ タスク
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● tdoi
●60ポイント ベストアンサー

Producer-Consumer問題を念頭にしているのかと最初は思ったのですが、その状況とは違うということでいいのですよね?

話が抽象的で実現したいことは正確には分からないですが、質問に書いてあることだけから判断するのであれば、タスクAでの処理は排他制御する必要がある場合も、ない場合もあると思います。

例えば、タスクBにおいて、変数Xが最新の値を必ず取得する必要があるのであれば、何らかの仕組みで、排他制御をしないといけないでしょう。

逆に、1つ前の状態の値などでもよい、複数回同じ値を読んでもよいのであれば、そもそも排他制御する必要はないでしょう。

ただし、変数がアトミックな命令で割り当てられないのであれば、排他制御しないと問題になります。

例えばですが、C++でプログラムを書いていて、

X = new SomeClass();

のようなグローバル変数を扱うのであれば、排他制御しないと、オブジェクトが中途半端に構築された状態で、タスクBからアクセスされることとなり、問題になります。


何かの参考になれば。

◎質問者からの返答

ありがとうございます!

えと、例えば タスクAからタスクB内のループを終了させたいので

変数Xに 999を入れたいのです。

タスクBは、ループ内で変数Xを監視して 999が入ってたら終了します。

この時、セマフォで保護しないと 999を代入している間に

中途半端な状態で、タスクBが変数を読んでしまわないか?

という心配ですが、どうでしょう???

(このケースでは、中途半端な数字になっても問題はありませんが)

イベントフラグを使うのが正しいのかもしれませんが、セマフォのお勉強という意味で。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ