2

pthread_mutex_t複雑な型付き変数 a ( ) を「ロック」するためにロックを使用していstd::listます。C#のように実際の変数をpthread_mutex_lock()使用しないため、「ロックアラウンド」と言います。そのため、オブジェクトはアクセスのためにロックされていることを知りません。std::listlockstd::list

したがって、2つの質問に対する答えが本当にわかりません。

1) 複合型をvolatile(など以外のint)としてマークするfloatと、C++ で何らかの効果がありますか? 上記のリンクされた記事 ( C#の場合) には、マークできるプリミティブ型と参照型のみがリストされているため、わかりませんvolatile

volatile2)手動でロックしている限り、C++ 複合型をマークする必要がありますか?

4

1 に答える 1

1

このvolatileキーワードは、変数が現在のスレッドの外部にある何らかのメカニズムを介して変更されている可能性があることをコンパイラに通知するため、一見冗長なアクセスを最適化してはなりません。一部のコンパイラは追加の意味を与える場合がありますが、それ以上の意味はありません-Microsoft Visual C ++コンパイラには次のように書かれています:

プロセッサはキャッシュ不可のメモリ アクセスを並べ替えませんが、コンパイラがメモリ アクセスを並べ替えないことを保証するために、キャッシュ不可の変数を volatile としてマークする必要があります。

ミューテックスコードは、保護された変数への読み取りと書き込みがミューテックスの境界を超えないようにするために必要なメモリフェンスをおそらく提供するので、それをマークするvolatile必要はないと思います-適切にミューテックスを実装しているため、別のスレッドがそれにアクセスしようとする可能性はありません。

于 2013-05-29T03:41:26.387 に答える