2011-11-14 10 views
3

可能性の重複:Linuxの/ Cで
Using C/Pthreads: do shared variables need to be volatile?C/gcc:スレッド間で共有されるグローバル変数はvolatileである必要がありますか?

:スレッド間で共有グローバル変数は、(スレッドの1に変更します変数を想定)揮発性宣言する必要がありますか?

スレッド内で変数をvolatileとして宣言するためにはどのような状況が必要ですか?

答えて

4

pthreadsを使用している場合、no-volatileは正しく同期するために必要でも十分でもありません。グローバル変数へのアクセスがmutex(または別の同期プリミティブ)によって適切に保護されている場合は、単純に通常の変数として宣言できます。

0

データを揮発性として宣言することが望ましい場合があります(主にアトミックであり、アトミック操作で操作される場合がほとんどです)。しかし、グローバルデータへのアクセスをシリアライズするために、同期メカニズム(mutexes、rwlocksなど)を使用することは非常に重要です。

volatileを使用する本当の理由はまれです。整数、および特殊なアトミック操作を使用する場合に使用します。

同期プリミティブを使用する必要があります。

-1

揮発性は変数が外部から変更される可能性があるのでコンパイラに伝えるだけなので、最適化はしないでください(読み書きはスキップしてレジスタに入れます)。したがって、複数のスレッドがそれを使用する場合、常にグローバル変数volatileを宣言する必要があります。

0

pthreadを使用しているときに誰かが必要ではないと言った人もいます。 pthreadがそのようなケースをどのように保護するかはわかりませんが、 マルチスレッド環境ではグローバル変数をvolatileと定義することが重要です。 理由はmyrkosが上記スレッドenvは、変数が を "外部的に"変更できるケースです。現代のコンパイルはあなたが思っていたよりも最適化しますが、変数が変更されていないと思われる場合は、メモリから値を読み取らないようにしてください。

しかし、グローバル変数をうまく機能させるには十分ではありません。それを保護するには、オートマチック演算を使用するか、 mutexを使用する必要があります。

関連する問題