- ベストアンサー
共有メモリでのデータ読み書きについて
Linuxで共有メモリを複数プロセスで読み書きする場合について質問させて頂きます。 CPUは32ビットで、共有メモリ上の、int(32ビット)の領域を 複数のプロセスで読み書きする場合を想定した場合、 セマフォ等でロックした方が良いのでしょうか? または、CPUが1命令で読み書きすることが可能 (と思っていますが、違っていればご指摘お願い致します)なので、 セマフォ等のロックをかけなくても、問題はないものなのでしょうか? 割りと良くありそうな疑問だと思ったのですが、 ウェブで調べた限りでは該当する質問はありませんでしたので、 質問させて頂きました。 ご回答宜しくお願い致します。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>ご回答頂いた内容で、「書き込み」と「更新」の違いが良く解りませんでした。 「読み出してその値を加工して書き込む」 つまり、「 a=a+b 」のような操作を「更新」と書きました。 この場合は実際には読み出し、演算、書き込みの3つの命令が実行されます。 読み出しと書き込みの間で、他のプロセスが書けないようにロックします。 No1の参考に書いたURLのページを見てください。 a=100 のようにaの値を読み出さずに、値と無関係に書き込むだけなら、ロックの必要は無いです。 同時に動く別プロセスが読み出す値は、100かもしれないし、100を書き込む前の値が50だったとすると50かもしれない。ただ、かならずどちらかで、それ以外の変な値になることはありません。
その他の回答 (2)
- hidebun
- ベストアンサー率50% (92/181)
共有メモリに書くデータに、サンプル番号を付けて、 ・データを書く ・そのデータに対応するサンプル番号を書く という処理を書いて、参照側はサンプル番号が付いているものは、 データも書けていると判定して、ロックフリーにしたことがありますねぇ。
お礼
ご回答ありがとうございます。 参考にさせて頂きます。
- notnot
- ベストアンサー率47% (4900/10358)
読み書きだけならロック無しで問題ありません。 ただ、読み書きだけってほとんど無意味でしょう。 内容を更新するなら、更新の前後にロックとロック解除が必要です。 参考: http://codezine.jp/article/detail/7564
補足
早速のご回答ありがとうございます。 ご回答頂いた内容で、「書き込み」と「更新」の違いが 良く解りませんでした。 説明不足だったとすれば申し訳ありません。 ある1つの共有メモリ上のint(32ビット)の領域に対して、 プロセスAが書き込み,プロセスBが読み込みを セマフォ無しで同時に実行した場合、 プロセスBは、プロセスAの中途半端な書き込み途中のデータを 参照してしまうことはないのでしょうか? というのが質問の真意です。 CPUはマルチコアを想定しています。 以上宜しくお願い致します。
お礼
ご回答ありがとうございます。 単純に1命令で読み出し、または書き込みを行うのであれば、ロックは不要ということですね。 ありがとうございました。