2012-05-06 10 views
0

私は複数のpthreadを持つプログラムを持っています。これらのスレッドは、getおよびset関数を介して共通ファイルにデータを静的変数に戻します。 1つのスレッドがgetLAT();を実行しており、他のが同時にsetLAT();を実行している場合 同時に変数を読み書きする

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

は何が起こるのだろうか?私のプログラムはクラッシュするだろうか?もしそうなら、どうすればこれを防ぐことができますか?

+1

クラッシュすることはありませんが、どのような価値があるのか​​は分かりません。文字どおり、競合状態です。 –

+0

設定されているもの以外に何かがあるのでしょうか? – Reid

+0

'LAT'の型宣言がありません。 – gcbenison

答えて

3

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

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

一部のプラットフォームおよびアーキテクチャでは、特定のアドレスにアライメントされた特定のサイズのオブジェクト(たとえば、16バイトのアドレスなどにアライメントされた場合はアトム4バイトの読み取りなど)のオブジェクトのアトミック読み取り/書き込みが保証されます。 )は起こりません。しかし、あなたは本当にそれが移植性がないので、その動作に依存することはできません。その動作が保証されていない場合でも、コードは99%の精度で実行されます。ただし、ショートカットをとっておらず、同期に悩まされたくない場合は、プロダクションの1%を除きます。

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

+0

どうすればこの問題を防ぐことができますか? – Reid

+0

更新された返信をご覧ください。 –

+0

ありがとうございます。それが助けになりました。 – Reid

関連する問題