9

POSIX 共有メモリ API (つまりshm_open) を使用してデータを共有する 2 つのアプリケーションを実装しました。1 つのプロセスが共有メモリ セグメントに格納されているデータを更新し、別のプロセスがそれを読み取ります。ある種のミューテックスまたはセマフォを使用して、共有メモリ領域へのアクセスを同期したいと考えています。これを行う最も効率的な方法は何ですか? 私が検討しているいくつかのメカニズムは

  • 共有メモリ セグメントに格納された POSIX ミューテックス (PTHREAD_PROCESS_SHARED 属性の設定が必要になります)
  • を使用して System V セマフォを作成するsemget
4

4 に答える 4

4

System V セマフォではなくsem_open()、などを使用して POSIX という名前のセマフォを使用します。

于 2013-01-16T17:44:02.873 に答える
2

これを答えにすることもできます。

true を指定してsem_initを使用するpsharedと、共有メモリ空間に POSIX セマフォを作成できます。私は過去にこれをうまく使いました。

これが共有ミューテックスおよび条件変数よりも速いか遅いかについては、プロファイリングだけがわかります。Linux では、「futex」機構に依存しているため、それらはすべてかなり似ていると思います。

于 2013-01-16T17:57:29.643 に答える
0

効率が重要な場合は、プロセス共有ミューテックスと条件変数を使用します。

AFAIR、セマフォを使用した各操作にはシステムコールが必要であるため、競合しないミューテックスは、ミューテックスのような方法で[ab]使用されるセマフォよりも高速である必要があります。

于 2013-01-16T17:49:18.523 に答える
0

まず、パフォーマンスが重要かどうかを知るために実際にベンチマークを行います。これらのもののコストは、多くの場合、過大評価されています。したがって、制御構造へのアクセスが書き込みと同じ桁数であることがわからない場合は、ユースケースに意味的に最適な構造を採用してください。これは通常、制御構造へのアクセスごとに約 100 バイトが書き込まれる場合に当てはまります。

それ以外の場合、制御構造がボトルネックである場合は、おそらくそれらの使用を避ける必要があります。C11 には、_Atomicデータへのアクセスに競合がある場合に使用できる型と操作の新しい概念があります。C11 はまだ広く実装されていませんが、おそらくすべての最新のコンパイラには、これらの機能を既に実装する拡張機能があります。

于 2013-01-16T18:00:18.103 に答える