2016-05-03 8 views
0
std::pair<Object, OtherObject*> currentData; 

void OnCallback() 
{ 
    Object object = getObject(); 
    OtherObject* otherObject = new OtherObject(); 
    currentData = std::make_pair(object, otherObject); 
} 

make_pairは原子ですか? make_pairフィールドをコピーするか、フィールドを戻り値からcurrentDataに移動しますか? currentDataの値に別のスレッドがアクセスしている場合、アクセスしたときにcurrentDataの値が不完全になる可能性はありますか?make_pairはアトミックですか?

残念ながら、make_pairの標準ドキュメントに関連する情報はありませんでした。

+1

"アトミック"の意味を説明できますか?明らかに 'std :: atomic'の意味では原子ではないからです。 – Brian

+1

'std :: make_pair'はmove-semanticsを使用していますが、それは' std :: atomic'に準拠してアトミックであることを意味しません。 – ArchbishopOfBanterbury

+2

'std :: atomic'の意味ではない場合、どういう意味ですか?あなたの引用符の意味は 'std :: atomic'のようなものだからです。 –

答えて

5

make_pair()がアトミックであるかどうかは関係ありません。

私はCURRENTDATAの値にアクセスする別のスレッドを持っている場合、それは アクセスだときCURRENTDATAの値が不完全になることを任意の可能性があり のですか?

ことが割り当て操作はスレッドセーフであるか否かを判断するものですので、ここでの唯一の問題は、std::pairの代入演算子はアトミックであるかどうかです。割り当てが行われる前に何が起こったのか、割り当てられている値がどのように生まれたのかは、割り当て操作のアトミック性とはまったく関係がありません。

この割り当て操作はアトミックではなく、スレッドセーフではありません。

+0

作成と割り当ての分離は良い点です。ありがとう。 –

関連する問題