我有一个简单的代码片段,其中编译器优化了变量“quot;“完成”
#包括<;pthread.h>;
#包括<;stdbool.h>;
bool done=false;
void*func(void*args)
{
完成=正确;
返回NULL;
}
main()
{
pthread_t p1;
pthread_create(&p1,NULL,func,NULL);
printf(“等待”);
而(!完成)
{}
printf(“继续…\n”);
}
这里,在没有volatile关键字的情况下,variable";“完成”;被优化掉并运行到无限循环中
我正在使用以下工具进行编译:
gcc-O2 volatile.c-lpthread
但当我使用simple func()版本时:
#包括<;stdbool.h>;
bool done=false;
void func()
{
完成=正确;
}
main()
{
func();
printf(“等待”);
而(!完成)
{}
printf(“继续…\n”);
}
但这里的变量是;“完成”;没有优化出来,两者有什么区别
在第二种情况下,编译器猜出了;“完成”;在Pthread的情况下,是否要改变一些方式
我的GCC版本是:
gcc——版本
gcc(Ubuntu 5.4.0-6ubuntu1~16.04.12)5.4.0 20160609
在这两种情况下,变量done都没有优化。优化出来的(在这两种情况下)是while循环中done的读取。该读数被吊出回路,并在回路之前发生一次;然后循环运行0次或无限次,具体取决于循环之前读取的doneread的值。它实际上成为
如果(!完成)
while(true){}
其他的
while(false){}
然后进一步简化为
如果(!done)而(true){