AFAIK有pthread函數充當內存障礙(例如,這裏是clarifications-on-full-memory-barriers-involved-by-pthread-mutexes)。但編譯時障礙,即編譯器(尤其是gcc)是否意識到這一點?換句話說 - 例如, - 是pthread_create()gcc不執行重新排序的原因?編譯時間障礙 - 編譯器代碼重新排序 - gcc和pthreads
例如代碼:
a = 1;
pthread_create(...);
是不是一定重新排序將不會發生?
什麼不同的功能調用:
void fun(void) {
pthread_create(...);
...
}
a = 1;
fun();
是有趣的()也編譯時屏障(假設在pthread_create()是)?
不同翻譯單位的功能如何?
請注意,我對gcc和pthreads的一般行爲規範感興趣,不一定需要x86特定的(各種不同的嵌入式平臺)。
我對其他編譯器/線程庫行爲也不感興趣。
變量是否具有內部或外部鏈接(靜態vs外部)有關係嗎? – Andy
在內部聯繫的主要變量可以被視爲與當地人類似。但是,如果它們即使是間接也可以外部訪問,那麼編譯器將不得不像它們一樣對待全局變量。例如,如果你的線程函數使用'static'變量,那麼它可以從外部間接訪問,因爲線程函數是從'outside'調用的(這可以被編譯器檢測到,因爲指向線程函數的指針被傳遞給外部功能)。 –
我真的不知道你最後的評論。恕我直言,靜態變量可以由線程通過其他外部函數間接使用(在線程創建之前獲取指向靜態a的指針)。 但是我正在尋找更多的東西,正式的描述(例如,鏈接到海灣合作委員會文件,郵件列表張貼)規則重新排序時可以發生和什麼時候不能。 – Andy