2

プロセス間でデータを共有するために、mmap されたファイルを使用します。

コードは次のようになります。

struct Shared
{
int Data;
};

int file = open("file.dat", O_RDWR);
Shared* shared = static_cast<Shared*>(
    mmap(0, sizeof(Shared), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_POPULATE, file, 0));
shared->Data++;

質問は次のとおりです。

  1. volatile 修飾子 ( volatile int Data) を使用する必要がありますか?
  2. 共有データ ( ) に対してアトミック操作を使用する必要があります__sync_fetch_and_add(&(shared->Data), 1)か?

今後の参考のために: Volatile: Most Useless for Multi-Threaded Programming .

4

3 に答える 3

1

複数のスレッドから整数を変更する場合は、volatile を使用しないでください。揮発性は必要ではなく、十分でもありません。アトミック操作で十分です。

于 2011-01-12T12:23:52.327 に答える
1

volatileが複数のプロセッサ間で正しく動作するという保証はありません。チェックする必要があるのは、操作中に組み込み関数が適切なメモリ バリアを挿入するかどうかです。

これはある種のセマフォですか?もしそうなら、そのような構成のプラットフォーム実装を使用する方がよいでしょう。

于 2011-01-12T12:19:16.843 に答える
-1

揮発性アクセスとアトミック アクセスの両方は必要ありません。mmap を使用する IPC は、それらがなくても正常に機能します。

何かが変更されたかどうかを通知する必要がある場合は、メッセージ キューを使用できますが、mmap の代わりにそれらを使用することもできます (送信するメッセージの大きさによって異なります。mmap はデータが大きい場合にうまく機能しますが、MQ はそうです200k より小さい)

于 2011-01-12T14:35:32.070 に答える