あなたの説明から、あなたがThreadParameter(またはいくつかの他のデータ構造への書き込みをしているようです)子スレッドを開始する前に、ThreadParameterに再度書き込むことはありません。必要に応じて読み込みが行われますが、初期化後は変更されません。あれは正しいですか?そうであれば、子スレッドがデータを読みたいとき、あるいはその問題について初めてのときでも、スレッド同期システムコール(またはプロセッサ/コンパイラプリミティブ)を使用する必要はありません。
揮発性の処理は、コンパイラによって異なります。私は少なくともPowerPCのDiabでは、揮発性の処理に関するコンパイラオプションがあることを知っています:変数への読み書きのたびにPowerPC EIEIO(またはMBAR)命令を使うか、それを使わないでください...変数に関連するコンパイラの最適化を禁止することに加えて、 (EIEIO/MBARは、プロセッサ自体によるI/Oの再命令を禁止するためのPowerPCの命令であり、すなわち、命令の後のすべてのI/Oが命令の後のI/Oの前に完了しなければならない)。
正確性/安全性の観点からは、それを揮発性と宣言するのは害ではありません。しかし、実用的な観点からは、ThreadParameterをStartThread()よりもずっと早く初期化すると、volatileを宣言することは本当に必要ではないはずです(そうしないと、後続のすべてのアクセスが高速になります)。かなりの関数呼び出し(printf()やcout、システム呼び出しなど)は、プロセッサがずっと前に書込みを処理していなかったことを保証するために必要以上に多くの命令を発行しますStartThread()を呼び出す前のThreadParameter。現実には、問題のスレッドが実際に起動する前に、StartThread()自体が十分な命令をほぼ確実に実行します。だから私はあなたが本当にそれを揮発性宣言する必要はないことを示唆している、おそらくStartThread()を呼び出す前に直ちにそれを初期化しても。
メインスレッドを実行しているプロセッサが初期化を実行する前に、その変数を含むページがすでに両方のプロセッサのキャッシュにロードされていた場合にどうなるかについての質問はこちらです:一般的に利用可能な汎用プラットフォーム同様の種類のCPUを使用する場合は、キャッシュの一貫性を処理するためのハードウェアがすでに用意されている必要があります。マルチプロセッサであるかどうかにかかわらず、汎用プラットフォーム上のキャッシュ・コヒーレンシーに問題がある場所は、プロセッサに個別の命令&データ・キャッシュがあり、自己変更コードを書き込む場合です。メモリーに書き込まれる命令は、データと区別できず、そのため、CPUは命令キャッシュ内のそれらの位置を無効にしないので、命令キャッシュ内のそれらの位置を無効にしない限り、命令キャッシュに古い命令が存在する可能性があります(プロセッサ固有のアセンブリ命令お使いのOSとスレッドの特権レベルに応じて実行することが許可されているか、OSに適切なキャッシュ無効化システムコールを発行してください)。しかし、あなたが記述しているのは自己修正コードではないので、あなたはその点で安全でなければなりません。
あなたの質問1は、すべてのプロセッサー・アーキテクチャーでこれを安全にする方法を尋ねます。上記のように、データバスが適切にブリッジされているような種類のプロセッサを使用している場合は、安全でなければなりません。マルチプロセッサ相互接続用に設計された汎用プロセッサは、スレッドメモリが共有メモリ領域を適切に構成する限り、共有メモリへの書き込みを検出するためのバススヌーププロトコルを備えています。組み込みシステムで作業している場合は、BSPでそれを設定する必要があります... PowerPCの場合は、MMU/BAT設定のWIMGビットを調べる必要があります。私は他のアーキテクチャに慣れていないので、それらにあなたに指摘してください。しかし、あなたのシステムが自家製であるか、あなたのプロセッサーが同種のものでない場合、2つのプロセッサーがお互いの書き込みを詮索することができない場合があります。ハードウェア関係者にアドバイスを求めてください。
SomeFunctionが複数のWorkerThreadを呼び出すと仮定します。私はあなたの質問がもっと似ていると思います: "同時読みで私に問題が起きますか?" ....? – Alex
まあ、POSIXスレッドを使うときは、グローバル変数初期化の問題を回避するには、['pthread_once()'](http://linux.die.net/man/3/pthread_once)を使ってください。あなたの "ポータブル"の定義に。 –
私は最良の解決策は 'boost:shared_mutex'で、読み取り専用を各スレッドにコピーするのがよいと思います。 – Pubby