1

複数のpthreadを持つプログラムがあります。これらのスレッドは、共通ファイルのget関数とset関数を介してデータを静的変数に報告します。

static int LAT;
void getLat(){
    return LAT;
}
void setLAT(int lat){
    LAT = lat;
}

getLAT();1つのスレッドが実行され、別のスレッドがsetLAT();同時に実行されている場合はどうなりますか?プログラムはクラッシュしますか?もしそうなら、どうすればこれを防ぐことができますか?

4

1 に答える 1

3

これは競合状態と呼ばれ、未定義の動作になります。なんでも起こる可能性がある。クラッシュする可能性は低く、書き込み前、書き込み後、または書き込み中の値が破損している可能性があります。

その破損した値をシステムコールやポインタオフセットなどで使用しようとすると、その時点でクラッシュします。

一部のプラットフォームとアーキテクチャは、特定のアドレスにアラインされた特定のサイズのオブジェクトのアトミック読み取り/書き込みを保証します(たとえば、16バイトアドレスにアラインされた場合のアトミック4バイト読み取りなど)。この場合、中間値(破損)は発生しません。 。しかし、移植性がないため、その動作に実際に依存することはできません。また、その動作が保証されていない場合でも、コードは99%の時間で正常に実行される可能性があります。ただし、本番環境では、ショートカットを使用せず、同期に煩わされないようにする必要がある場合を除きます。

この競合状態からコードを保護するには、ミューテックスまたはcmpxchgなどのアトミック読み取り/書き込み命令を使用する必要があります。

于 2012-05-06T02:33:29.673 に答える