2012-02-27 20 views
0

2つのプログラムが同時にアクセスすると、共有メモリが破壊されますか?書き込みと書き込みは同時に行われますか?共有メモリC++読み込みと書き込みの同期

私は1つのサーバーやウェブからいくつかのデータを取得し、共有メモリに解析されたデータが保存されます、二つのプログラムを持っている、と私は最後に保存されたデータセットまで読み込みます読み出したプログラムを、持っています。最初のプログラムは、100台のサーバーからデータを収集し、101thサーバに現在いる場合

は、例えば、100番目のサーバまでのすべてのデータは、リーダプログラムによって読み取られます。 101番目が終了すると、リーダープログラムは101番目のデータセットを読み込みます。 ここでは、サーバーからのデータセットに、ディスク領域、負荷などの複数のデータが含まれている可能性があります。 このような種類のアクセスは共有メモリ内のデータを破壊しますか?それとも私はそれを行う方法は大丈夫ですか?

+1

CまたはC++?タグのC、キャプションのC++。 – vulkanino

+0

特定のアーキテクチャまたはISA? – Necrolis

答えて

4

は、あなたが他のプログラムがそれに書き込みが行われている間は、メモリから読み出さしようとした場合、あなたが最も可能性の高い破損したデータを取得しますReaders-writers

と呼ばれ、実際に並行処理で共通のコンピューティングの問題です。この状況が起こらないように、同期プリミティブ(ロック、セマフォ、モニタなど)のいずれかを使用する必要があります。

The Little Book of Semaphores、特にの章を参照することをお勧めします。4.2リーダライターの問題

4

スレッドではなくプロセスでこれを行う理由はありますか?それはあなたの人生を同期の観点から難しくするかもしれません。

あなたがスレッドを使用していた場合は、読者はライターが書いていることを設定し、同じデータを読んでいないことを保証することができるように私は、セマフォを使用してアクセスを保護するためにあなたを言うだろう。セマフォやその他の同期プリミティブの実装は、プロセス間共有メモリにも存在しますが、これはあまり一般的ではありません。

あなたは間違いなく誰か他の人の同期プリミティブを使用しなければならない理由は、最近のハードウェア上で、書き込み、ということです例えば並べ替えまたは遅延させることができます最初のプログラムは「現在101台目のサーバ」ですが、実際には100台目のサーバのデータへの書き込みはまだCPUから書き戻されていません。セマフォまたはミューテックスには、メモリが他のスレッド/プロセスと一貫して見えるように書き込みをフラッシュするための適切なメモリフェンシング命令が含まれます。独自の同期ロジックを作成するのではなく、他人の注意深く書かれた実装を絶対に使用する必要があります。プロセス間の競合条件がはるかに少ないユニプロセッサボックスに表示される可能性があるとしても

、あなたはそれをテストしている、あなたはマルチプロセッサマシン上でテストすることが非常に重要です。あなたが説明してきた何

+1

LihOは正しいです。並行性はバグの肥沃な土台であるため、あなたがそれに取り組む前に、読者 - ライターの問題をよく読んでみたいです。 – zmccord

関連する問題