[英]Are pre-main global initializers guaranteed to run single-threaded?
例如,以下代碼段中的node::node()
構造函數訪問globals node::count
和::tail
而不使用任何多線程保護。 C ++標准是否保證輸出始終是0 1 2
的排列(無論順序如何)?
#include <stdio.h>
struct node *tail;
struct node
{
static int count;
int index;
node *prev;
node()
{ index = count++; prev = tail; tail = this; }
};
int node::count;
node one, two[2];
int main(int argc, char *argv[])
{
for(node *p = tail; p; p = p->prev)
printf("%d\n", p->index);
return 0;
}
我正在尋找基於(適用)標准的答案,而不是針對實現或編譯器特定行為。 關於SO有很多相關的問題但是它們並不完全清楚它們是如何直接應用於這個特殊且相當基本的情況( C ++靜態成員變量初始化線程安全嗎? , C ++ 11中的局部靜態變量初始化線程 安全嗎? ?等)。
只要程序本身不啟動線程(例如在某個全局變量的構造函數中),全局變量的初始化就可以保證是單線程的。 一旦發生這種情況,就可以在一定程度上實現剩余的初始化。
[basic.start.init] / 2 ...在單個翻譯單元中定義的有序初始化的變量應按其在翻譯單元中的定義順序進行初始化。 如果程序啟動一個線程(30.3),則對於在不同轉換單元中定義的變量的初始化,后續的變量初始化是未排序的。 否則,對於在不同轉換單元中定義的變量的初始化,變量的初始化是不確定地排序的。 如果程序啟動一個線程,則對於每個其他動態初始化,后續無序的變量初始化都是無序的。 否則,對於每個其他動態初始化,變量的無序初始化是不確定地排序的。 [ 注意:此定義允許與另一個序列同時初始化一系列有序變量。 - 尾注 ]
“不確定順序”是保證單線程執行的部分。 根據定義, 排序{before,after,indeterminately}的概念僅在單個線程中有意義:
[intro.execution] / 13 之前的順序是......由單個線程執行的評估之間的關系......
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.