[英]Difference between interlocked variable access (on boolean) and std::atomic_flag
[英]std::atomic_flag as member variable
在 class 構造函數中初始化std::atomic_flag
的安全方法是什么?
這個問題似乎在問我問的同一個問題——除了這里提問者抱怨編譯器問題。
我的問題與 C++ 標准本身有關。 根據此站點,未指定使用構造函數初始化程序語法初始化std::atomic_flag
。
std::atomic_flag static_flag = ATOMIC_FLAG_INIT; // static initialization,
// guaranteed to be available during dynamic initialization of static objects.
int main()
{
std::atomic_flag automatic_flag = ATOMIC_FLAG_INIT; // guaranteed to work
// std::atomic_flag another_flag(ATOMIC_FLAG_INIT); // unspecified
}
這些信息是否正確? 如果是這樣,我假設:
struct Foo
{
Foo() : flag(ATOMIC_FLAG_INIT)
{ }
std::atomic_flag flag;
};
...也未指定。 那么,這是否意味着我們不能使用std::atomic_flag
作為 class 的成員變量? 或者,如果我們從 class 構造函數中簡單地調用std::atomic_flag::clear()
是否安全?
自N3337到N3936(當前的C ++ 14草案)以來,關於使用ATOMIC_FLAG_INIT
的措辭已經改變。 前者在示例中顯示了ATOMIC_FLAG_INIT
宏的復制初始化上下文中的可能用法, ATOMIC_FLAG_INIT
宏是非規范性的,並未提及有關在其他初始化上下文中使用的任何內容。
N3936闡明了用法,並且不再列出復制初始化用法作為示例,而是作為描述本身的一部分。
§29.7/ 4 [atomics.flag]
應以這樣的方式定義宏
ATOMIC_FLAG_INIT
,使其可用於將atomic_flag
類型的對象初始化為清除狀態。 宏可以以下列形式使用:atomic_flag guard = ATOMIC_FLAG_INIT;
未指定宏是否可以在其他初始化上下文中使用 。 對於完整的靜態持續時間對象,該初始化應該是靜態的。 除非使用
ATOMIC_FLAG_INIT
初始化,否則未指定atomic_flag
對象的初始狀態是set還是clear。
這里討論了這些變化的基本原理。
所以你是對的,不能依賴在成員初始化列表中使用宏。 解決方案是使用非靜態數據成員初始化程序或大括號或 atomic_flag
初始化來初始化atomic_flag
。 然后它將在復制初始化上下文中初始化。
struct Foo
{
std::atomic_flag flag = ATOMIC_FLAG_INIT;
};
C ++ 11標准(嗯, N1570 )對ATOMIC_FLAG_INIT
的定義的實際文本是
7.17.8原子標志類型和操作
...
宏
ATOMIC_FLAG_INIT
可用於將atomic_flag
初始化為清除狀態。 一個atomic_flag
未明確與初始化ATOMIC_FLAG_INIT
最初處於不確定狀態。例
atomic_flag guard = ATOMIC_FLAG_INIT;
C ++標准使用單詞initialize來指代變量可以賦予初始值的所有各種方式。 由於沒有相反的措辭,我將意圖讀作atomic_flag guard(ATOMIC_FLAG_INIT)
,並且在構造函數初始化列表中使用ATOMIC_FLAG_INIT
也是有效的而不是未指定的。 我認為你引用的網站在單個例子中讀得太多了。 在這個標准的例子是不規范的,特別是,這樣的例子顯示做一些事情並不意味着那就是做的唯一可接受的方式的一種方式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.