2016-11-25 10 views
3

"メイン"スレッドが1つあり、グローバル変数を初期化し、そのスレッドがその変数にアクセスするスレッドを後で生成する場合は、変数が新しいスレッドに初期化されていることを保証するために、std :: atomic_thread_fence(memory_order_seq_cst)の呼び出しなどの作業私は、メインスレッドが新しいスレッドを作成するという事実は、どのレースも防止するのに十分な「同期化された」関係を確立すると考えていますが、私は確信していません。プログラムの先頭に設定されたC++のメモリセマンティクスとグローバル

は、ここで私が説明しています何のためにいくつかの擬似コードです:

class MyApi { 
public: 
    static void init(Foo *foo) { 
     MyApi::foo = foo; 
    } 

    static Foo* getSharedFoo() { 
     return foo; 
    } 

private: 
    static Foo* foo; 
}; 

void main() { 
    Foo* foo = new Foo(); 
    MyApi::init(foo); 
    // Spawn threads that will call MyApi::getSharedFoo() and expect 
    // to receive the same foo that is created above. 
} 

答えて

2

いいえ、あなたは特別な何もする必要はありません。新しいスレッドは、それらが構築された時点までのすべてのメモリ変更を参照します。

0

30.3.1.2スレッドコンストラクタ

[...]テンプレートの明示的なスレッド(F & & F、 Argsの& & ...引数)。

[...]

同期:Fのコピーの呼び出しの開始と同期 コンストラクタの呼び出しが完了しました。

は、スレッドを生成したstd::threadオブジェクトを構築する前に発生したすべての情報を表示するように指定しています。

関連する問題