複数のプロセスがアクセスする共有メモリーのブロックがあります。1つのパブリッシャーと複数のサブスクライバーのアクセス制御
私はパブリッシャーと呼ばれる情報を書き込み/更新するプロセスが1つあり、このデータを読み取っているプロセスが複数あります(これはサブスクライバーを呼び出しています)。
これは、購読者にパブリッシャからの書き込み/更新の途中で読むことを望まないため、現在共有メモリにあるデータが購読者がそれを取る前に完全に更新されます(書き込みの途中では読み上げません)。
これは私が設計しようとしている動作です:
- Publisherは、共有メモリを変更することがありますが、他の加入者は、現在、メモリからの読み出していない場合のみです。
- パブリッシャが現在変更していない限り、任意のサブスクライバは共有メモリから読み取ることができます。
- ユーザは共有メモリを変更することはできません。したがって、コンシューマは同時に読み取ることができます(パブリッシャが共有メモリを変更していないことを前提とします)。
私が考える最初の解決策は単純ミューテックスで、またはサイズ1のセマフォは、これは、加入者は、新たな情報を取得するたびに、彼らはによって更新されるようにメモリを待つ必要があるだろうことを意味します出版社。ただし、これは、サブスクライバが他のサブスクライバを待たなければならない意図しない結果と、十分なサブスクライバがシステム上に存在する場合、パブリッシャが遅延したり、新しいデータをパブリッシュできない可能性があります。
私はshm
に探していたと考えると、パブリッシャーとサブスクライバーの役割を強制するのに便利に見えるが、それ以外はただ、彼らは何ができるのかを強化しませ助けているようだSHM_LOCK
とSHM_UNLOCK
を見つけた第二の溶液必ずの場合はとすることができます。
また、上記のサブスクライバがパブリッシャになり、それぞれが共有メモリのブロックを特定の値に設定する場合とそうでない場合がある逆の場合があります。 (メモリのブロックに書き込むことは保証されていませんが、書き込みが行われた場合は値がPublishersで同じになることが保証されています)。上のPublisherはSubscriberになります。
補遺:
- 各パブリッシャとサブスクライバは、個々のプロセスです。
- 私の質問の「共有メモリ」は、メモリの複数の異なるキャッシュを表し、1つのユニットではありません。私のパブリッシャーがN個のデータ単位のうちの1つだけに更新を発行したときに、すべての共有メモリーがサブスクライバーからロックアウトされることは望ましくありません。
- パブリッシャー(最初の部分から)はデーモンです。私の論理は、データをどこかに置いて、デーモンにタイムリーなアクションをさせたいということです。私はデーモンが加入者によって大きな妨げにならないようにしたい。
私の質問:
- 適切に上記のロジックをコード化することができる制御方式はありますか? (パブリッシャーはアクセス権を設定して削除します。アクセシブルにアクセスすると購読者にアクセスします)
- この場合、複数のプロセスに情報を公開する方が良い方法はありますか?この状況で共有メモリを使用する方法はありますか?
ここには、[同期チュートリアル](https://www.classes.cs.uchicago.edu/archive/2017/winter/51081-1/LabFAQ/lab7/Semaphores.html)_があります。セマフォー。 – ryyker