为什么这个变量没有优化

我有一个简单的代码片段,其中编译器优化了变量“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){

发表评论