1

スレッド化された C++11 コードを書いていますが、メモリ フェンスなどをいつ使用する必要があるか完全にはわかりません。だからここに基本的に私がやっていることです:

class Worker
{
   std::string arg1;
   int arg2;
   int arg3;
   std::thread thread;

public:
   Worker( std::string arg1, int arg2, int arg3 )
   {
      this->arg1 = arg1;
      this->arg2 = arg2;
      this->arg3 = arg3;
   }

   void DoWork()
   {
      this->thread = std::thread( &Worker::Work, this );
   }

private:
   Work()
   {
      // Do stuff with args
   }
}

int main()
{
   Worker worker( "some data", 1, 2 );
   worker.DoWork();

   // Wait for it to finish
   return 0;
}

別のスレッドで実行される Work() 関数で引数に安全にアクセスできるようにするには、どのような手順を実行する必要があるのか​​ 疑問に思っていました。コンストラクターに記述して、別の関数でスレッドを作成するだけで十分ですか? または、メモリ フェンスが必要ですか? 3 つの引数すべてがメイン スレッドによって書き込まれ、ワーカー スレッドによって読み取られるようにメモリ フェンスを作成するにはどうすればよいですか?

助けてくれてありがとう!

4

1 に答える 1

6

C++11 標準セクション 30.3.1.2スレッド コンストラクター [thread.thread.constr] p5 では、コンストラクターについて説明していtemplate <class F, class... Args> explicit thread(F&& f, Args&&... args)ます。

同期:コンストラクターの呼び出しの完了は、 のコピーの呼び出しの開始と同期しますf

したがって、スレッド関数が呼び出される前に、現在のスレッド内のすべてが発生します。Workerメンバーへの割り当てが完了し、新しいスレッドに表示されるようにするために、特別なことをする必要はありません。

一般に、マルチスレッド C++11 を記述する場合は、メモリ フェンスを使用する必要はありません。同期はミューテックス/アトミックに組み込まれており、必要なフェンスを処理します。(注意:リラックスしたアトミックを使用する場合は、自己責任です。)

于 2013-06-19T14:24:45.967 に答える