2011-01-12 6 views
1

私はプロセス間でデータを共有するためにmmap'edファイルを使用します。mmap'edファイルによるIPC:アトミックおよび/またはvolatileを使用する必要がありますか?

コードは次のようである:

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: Almost Useless for Multi-Threaded Programming

答えて

1

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

+0

スレッドはプロセスとは関係ありません(IPCはプロセス間通信を表します)。 –

+0

@VJo:ハァッか。プロセスは少なくとも1つのスレッドです。詳しく教える? –

+0

はい、それは少なくとも1つのスレッドですが、どのようなアトミック操作がプロセスと関係していますか? mmapされたデータの場合、アクセスするために特別なものは必要ありません。 –

1

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

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

+0

これはセマフォではなく、共有カウンタです。つまり、いくつかのプロセスによって変更される可能性のある意味のあるデータです。 – VladV

-1

揮発性アクセスとアトミックアクセスの両方を必要としません。 mmapを使用しているIPCはそれらなしでうまく動作します。

message queuesを使用することができますが、mmapの代わりに使用することもできますそれは200kより小さいです)

+0

ここでmmapを使う主な理由は、永続性のためです。私は実行中にディスク上にデータを保持しておきたいと思います。このようにして、どのような種類のシリアル化も実装する必要はありません(また、プロセスが予期せず終了した場合に実際のデータを確実に保存することもできます)。 – VladV

+0

@VladVこの場合、共有メモリが必要です。 mmapではありません –

+0

あなたは、あなたが話していることについて何も考えていないようです。 mmap()を使用せずに共有メモリを使用することはできません。実際、プロセスのすべての仮想メモリはmmap()を使ってマップされます。 –

関連する問題