4

特定のタイプがアトミックかどうかを判断できるかどうか疑問に思います (つまり、ミューテックスなしで操作を実行でき、自分自身を危険にさらすことはありません)。

タイプがアトミックかどうかatomic(type)を判断する定義があるのだろうか。そのようなものを作成するにDEFINE( (int)(do) );は、次のような擬似コードを作成します。

   int _do;

#if !atomic(int)
    mutex do_mutex;
#endif   

   void set_do(int do)
   {
#if atomic(int)
       _do = do;
#else
       lock(do_mutex);
       _do = do;
#endif
   }

タイプがアトミックである場合、define/mtl レベルでチェックする方法はありますか (必要に応じてブーストを使用)。

4

2 に答える 2

8

<atomic>ヘッダーは、ATOMIC_INT_LOCK_FREEさまざまなサイズの組み込み型すべてに対応しています。これらはプリプロセッサ マクロであり、型のアトミック バリアントが決してロック フリーでない場合は 0 に定義され、時々ロック フリーである場合 (たとえば、ターゲット システムがサポートしている場合) は 1 に定義され、常にロック フリーである場合は 2 に定義されます。たとえば、std::atomic<int>が常にロック フリーであるが、たまstd::atomic<long long>にしかない場合は、ATOMIC_INT_LOCK_FREE2 になり、ATOMIC_LLONG_LOCK_FREE1 になります。ポインタ型は でカバーされATOMIC_POINTER_LOCK_FREEます。

intこれらのマクロを使用して、ロックフリーでない場合にプレーンとミューテックスを使用することを決定できますstd::atomic<int>が、ほとんどの場合、単に記述std::atomic<int>してコンパイラーに処理させる方がよいでしょう。

于 2013-01-31T16:06:17.523 に答える