2016-12-23 11 views
4

std::atomicを見てみると、それはデフォルトの専門分野は、私が読んだ:std ::組み込み型のアトミック - 非ロックフリーと些細なデストラクタ?

これらの専門分野は、標準的なレイアウトを持って、自明なデフォルトコンストラクタ、および些細なデストラクタ

Iはまたis_lock_freeため読み出す:

std::atomic_flag以外のすべての原子タイプではなくロックフリー 原子CPU命令を使用するよりも、 ミューテックスまたは他のロック操作を使用して実施することができます。原子タイプは時々ロックフリーの でも可能です。アライメントされたメモリアクセスのみが特定のアーキテクチャー上で原子番号 に自然にある場合、同じタイプのミスアラインされたオブジェクトは ロックを使用する必要があります。

は今ここに、私は取得しないキャッチです:

どの規格が今までミューテックスのいずれかの種類を使用して些細なCTOR /デストラクタを規定している任意のatomic入力することができます - 私が今まで来たすべてのmutex必要な場合には、以外 - 個人初期設定。

これは、次の質問につながる:

  • する主要なプラットフォームは、オブジェクトごとに「initalization自由」である(ミューテックスのような)任意のロック操作を提供しています。
  • デフォルトではstd::atomicの特殊化はまだロックフリーではない(まだのctor/dtorの要件を満たしています)の実装はありますか?
  • 私はここで何かを混乱させるだけですか? :-)

私は、最も簡単なスピンロック(atomic_flag参照)でも簡単な初期化が必要なので、これをどのように実装できないかわかりません。

免責事項:これらのドキュメントを読んでいるうちに、まあまあ飛び出しました。

答えて

4

アトミック操作でロックが使用されても、単純なコンストラクタとデストラクタがある場合、mutexは多くのアトミック値間で共有されるグローバルミューテックスである可能性があります。

これは、私が信じているのは、標準的な著者が認めているケースです。いくつかの一般的なプラットフォーム(POSIXなど)では、静的持続時間を持つmutexのための簡単なコンストラクタとデストラクタを使用することができます。 std::atomicデフォルトコンストラクタは非自明であることを許された

// This is copied plain C here, not C++ 
// So nothing fancy 
#include <pthread.h> 
pthread_mutex_t my_mutex = PTHREAD_MUTEX_INITIALIZER; 

場合、初期化時にそれらを使用することは困難であろう。

std::atomic<int> my_flag; 

my_flag些細コンストラクタを持っているので、静的な初期化です。動的初期化の前に静的初期化が行われます。したがって、コンストラクタを実行する前に、すべてのグローバル変数std::atomicが初期化されていることを確認することができます。

+0

Ha!はい、これは標準的な要件を満たすと思われます。しかし、ほとんどの現実世界のユースケースに対してちょっとばかげているようですね! –

+0

はい、それは気違いです。しかし、人々は狂気のようなアーキテクチャで動作するC++コードを書くことを望んでいます。 –

+0

Wrt。あなたの編集:コードは(静的な)オブジェクトを値に設定するので、*簡単な初期化ではありません。 (?)もちろん、これを使用するオブジェクトは何もする必要はないので、簡単なctorを持つことができます。 –

関連する問題