关于编译器的一个问题
今天看了下@leekayak 提到的一个问题 http://weibo.com/1465082730/znOSZzU4v
我试图用一个简单的例子来解释下,首先看一段更简单的代码。
#include "stdio.h"
#include "stdlib.h"
#include <pthread.h>int f = 0;
int x= 0;void* t1(void*)
{while(f==0){if(x!=0) printf("error");}return NULL;
};void* t2(void*)
{x=1;f=1;return NULL;
};int main(void)
{pthread_t* worker = (pthread_t*) malloc(2*sizeof( pthread_t));pthread_create(&worker[0],NULL,t1,NULL);pthread_create(&worker[1],NULL,t2,NULL);pthread_join(worker[0],NULL);pthread_join(worker[1],NULL);free(worker);return 0;}
我们用-O3 来编译,就发现问题了。编译器版本:gcc version 4.7.2 20120921 (Red Hat 4.7.2-2) (GCC)
在400788:处发现指令自己jmp到自己(_z2t1pv+0x18) = 400770+18 = 400788 就死循环了。
这是因为在t1这个函数的局部,看不到f被改变的期望,因此编译器就自作主张认为f不会变化,等价于死循环,其实这个等价是错误的,因为f可能被外部修改。比如t2
因此就这个case,将f的定义 加上volatile是一个简明的法子,volatile int f = 0; 声明了编译器不能假设f值会是什么,而是必须去read一下才行。
另外的方法就是显示的加入memory barrier,强制编译器必须读取。
while(f==0) { if(x!=0) printf("error"); }
改成
for(__sync_synchronize();f==0;__sync_synchronize())
{
if(x!=0) printf("error");
}
from: http://blog.csdn.net/pennyliang/article/details/8683391
关于编译器的一个问题相关推荐
- 用vb思设计Java编译器_一个简单的VB-VC编译器 - 程序设计(Programming)版 - 北大未名BBS...
发信人: phoenix (凤凰), 信区: VisualBasic 标 题: 一个简单的VB-VC编译器 发信站: PKU BBS (Thu Jan 6 14:05:52 2000), 转信 V ...
- Android studio 编译器导入一个背景图片
这个下载一个插件就可以了 具体步骤 输入Sex Editor 下载即可. 之后重启as之后 之后看看效果图 注意的地方就是 下载之后的图片可能很小 需要自己调整下 window 自带的画图工具即可
- 关于编译器的一个疑问
今天看了下@leekayak 说到的一个疑问 http://weibo.com/1465082730/znOSZzU4v 我试图用一个简略的例子来解说下,首先看一段更简略的代码. #include & ...
- (3) 用java编译器实现一个简单的编译器-语法分析
转载地址:http://blog.csdn.net/tyler_download/article/details/50708807 视频地址:http://study.163.com/course/c ...
- java语言的编译器_JAVA语言编译器是一个CASE工具。()。
的适性组引导应症织再生术,编译除外. 外汇的描下列汇率关于述,工具的是正确. 7变我国对人的1美元民币汇率化为由27月月的5年年7,编译则下确的法正列说是(. 不同不同位工单项.工具单的风项目险来目中 ...
- 编译器设计(一)——简单介绍一个编译器的结构
一个编译器的结构 一.语言处理器 二.编译器的结构 三.词法分析 四.语法分析 五.语义分析 六.中间代码生成 七.机器无关代码代码优化 一.语言处理器 计算机很笨,只能认识0和1,而人呢,脑子的存储 ...
- C++对象模型2——编译器生成构造函数的几种情况
如果程序员没有提供构造.析构.拷贝构造以及operator=,编译器并不会总是提供一个合成版本,比如下面的代码 class test{};int main(int argc, char const * ...
- 最强通用编译器优化工具!MIT三篇顶会论文打造,准确率是传统方法5倍
乾明 十三 发自 凹非寺 量子位 报道 | 公众号 QbitAI 新代码在自家芯片上运行状况如何?英特尔自己都没有别人家的新工具清楚. 这就是MIT耗时一年提出的研究成果,名为Ithemal,核心功能 ...
- 这是一个有趣的问题,Java 8 Lambda 表达式被编译成了什么?
在了解了Java 8 Lambda的一些基本概念和应用后, 我们会有这样的一个问题: Lambda表达式被编译成了什么? 这是一个有趣的问题,涉及到JDK的具体的实现.本文将介绍OpenJDK对Lam ...
最新文章
- 一次谷歌面试趣事(转)
- 栈----迷宫(Maze)
- yolov5 多版本共存
- Spring MVC之@RequestMapping 详解
- php实现电话拨打,jquery mobile实现拨打电话功能的几种方法_jquery
- CSS 布局与“仓库管理”的关系
- linux shell 网盘,linux在shell中获取时间
- alwayson高可用组_AlwaysOn可用性组–如何在集群实例和独立实例之间设置AG(第3部分)
- 扫地机器人滤网顺序_扫地机器人如何维护 扫地机器人维护技巧【介绍】
- 查看linux的iso文件名,查看ISO文件信息
- 直播app源码,跳转站外链接或平台内部跳转页面
- 游戏项目导出AAB包上传谷歌提示超过150M的解决方案
- 【Errors】Errors during downloading metadata for repository ‘AppStream‘:
- 2009年中国各省人均GDP排名(鄂尔多斯人均GDP将很有可能超过两万美元,全国第一)...
- 一文总结图像生成必备经典模型(二)
- 埃尼阿克计算机怎么运行的
- 怎么看台式计算机的屏幕大小,如何在计算机上查看显示器尺寸win10
- 访问使用https协议的网址时,浏览器地址栏没有显示“安全锁”的标志的问题
- python中continue的用法_关于Python中continue用法问题
- Mac开发利器之程序员编辑器MacVim