2

共有メモリに相互排除のためのピーターソンのアルゴリズムを実装しました。通信のために、c++ と Java プロセス (jni を使用) の間で共有メモリを使用しています。問題は、何らかの形でまだ競合状態が発生していることです。printf/println を使用してデバッグしようとすると、コードは正常に動作し始めますが、それらのプリントを削除するとすぐにプロセスが停止します。誰かがどこに問題があるのか​​教えてもらえますか? ピーターソンのアルゴリズムの実装が正しいと確信しています。相互排除のために代わりにセマフォ(semget())を使用する必要がありますか?

4

3 に答える 3

5

アルゴリズムを適切に実装するには、バリアを使用して、コードで指定した順序でメモリが読み書きされるようにする必要があります。ここから2番目の段落を読んでください:

最近のほとんどの CPU は、実行効率を向上させるためにメモリ アクセスの順序を変更します (許可されている並べ替えの種類については、メモリの順序を参照してください)。このようなプロセッサは、通常、メモリ バリア命令を介して、メモリ アクセスのストリーム内で順序付けを強制する何らかの方法を必ず提供します。メモリ アクセスの順序を変更するプロセッサでのピーターソンおよび関連アルゴリズムの実装では、通常、このような操作を使用して正しく動作し、連続した操作が誤った順序で行われないようにする必要があります。メモリ アクセスの並べ替えは、命令を並べ替えないプロセッサ (Xbox 360 の PowerPC プロセッサなど) でも発生する可能性があることに注意してください。

はい、車輪を再発明する代わりに、システム (ミューテックス) によって提供される同期メカニズムを使用します。

于 2011-06-11T20:49:40.337 に答える
0

あなたの問題は、相互排除ではなく、共犯化に関連していると思います。Peterson アルゴリズムは、1 つのプロセスのみが重要な領域にあることを保証し、どのプロセスが重要な領域にある必要があるかを保証しません。あなたの問題が私が言及したとおりである場合は、Moniter を同期として使用することをお勧めします。

于 2012-03-20T01:30:42.460 に答える