编辑和后约翰内斯宝贵的回答,改进我的问题这里是不稳定的吗?
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