編輯和後約翰內斯寶貴的回答,改進我的問題這裏是不穩定的嗎?
bool b = true;
volatile bool vb = true;
void f1() { }
void f2() { b = false; }
void(* volatile pf)() = &f1; //a volatile pointer to function
int main()
{
//different threads start here, some of which may change pf
while(b && vb)
{
pf();
}
}
所以,讓我們忘了同步一會兒。問題是b是否必須被宣佈爲不穩定。我已閱讀標準和排序 - 知道易失性語義的正式定義(我甚至幾乎理解它們,這個詞幾乎就是關鍵)。但是,讓我們在這裏有點不正式。如果編譯器在循環中看到b沒有辦法改變,那麼除非b是易失性的,它可以優化它,並假定它等於while(vb)
。問題是,在這種情況下,pf本身是不穩定的,那麼編譯器是否允許假設b在循環中不會改變,即使b不是易失性的?
請不要評論和解答這段代碼的風格,這不是一個現實世界的例子,這是一個實驗性的理論問題。 評論和回答,除了回答我的問題,還解決更詳細的揮發性的語義,你認爲我誤解了非常受歡迎。
我希望我的問題很清楚。 TIA
編輯一次:
這個怎麼樣?
bool b = true;
volatile bool vb = true;
void f1() {}
void f2() {b = false;}
void (*pf)() = &f1;
#include <iosrteam>
int main()
{
//threads here
while(b && vb)
{
int x;
std::cin >> x;
if(x == 0)
pf = &f1;
else
pf = &f2;
pf();
}
}
這兩個程序之間有一個主要的區別。如果是,有什麼區別?
我不知道C很好。如果此代碼也是有效的C(除了bool,我認爲它不存在於C中),請告訴我,以便我將C標記添加到問題中 – 2010-10-16 17:37:15
它是有效的C如果您#include –
ybungalobill
2010-10-16 17:58:25
請先寫代碼提出你的問題,然後問。不斷改變自己的答案是沒有意義的。此外,允許更改哪些線程(假設正確同步)?某些部分是否存在互斥體? (即圍繞「assign-pf + call」部分?) – 2010-10-16 18:24:00