今天看了下@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

关于编译器的一个问题相关推荐

  1. 用vb思设计Java编译器_一个简单的VB-VC编译器 - 程序设计(Programming)版 - 北大未名BBS...

    发信人: phoenix (凤凰), 信区: VisualBasic 标  题: 一个简单的VB-VC编译器 发信站: PKU BBS (Thu Jan  6 14:05:52 2000), 转信 V ...

  2. Android studio 编译器导入一个背景图片

    这个下载一个插件就可以了 具体步骤 输入Sex Editor 下载即可. 之后重启as之后 之后看看效果图 注意的地方就是 下载之后的图片可能很小 需要自己调整下 window 自带的画图工具即可

  3. 关于编译器的一个疑问

    今天看了下@leekayak 说到的一个疑问 http://weibo.com/1465082730/znOSZzU4v 我试图用一个简略的例子来解说下,首先看一段更简略的代码. #include & ...

  4. (3) 用java编译器实现一个简单的编译器-语法分析

    转载地址:http://blog.csdn.net/tyler_download/article/details/50708807 视频地址:http://study.163.com/course/c ...

  5. java语言的编译器_JAVA语言编译器是一个CASE工具。()。

    的适性组引导应症织再生术,编译除外. 外汇的描下列汇率关于述,工具的是正确. 7变我国对人的1美元民币汇率化为由27月月的5年年7,编译则下确的法正列说是(. 不同不同位工单项.工具单的风项目险来目中 ...

  6. 编译器设计(一)——简单介绍一个编译器的结构

    一个编译器的结构 一.语言处理器 二.编译器的结构 三.词法分析 四.语法分析 五.语义分析 六.中间代码生成 七.机器无关代码代码优化 一.语言处理器 计算机很笨,只能认识0和1,而人呢,脑子的存储 ...

  7. C++对象模型2——编译器生成构造函数的几种情况

    如果程序员没有提供构造.析构.拷贝构造以及operator=,编译器并不会总是提供一个合成版本,比如下面的代码 class test{};int main(int argc, char const * ...

  8. 最强通用编译器优化工具!MIT三篇顶会论文打造,准确率是传统方法5倍

    乾明 十三 发自 凹非寺 量子位 报道 | 公众号 QbitAI 新代码在自家芯片上运行状况如何?英特尔自己都没有别人家的新工具清楚. 这就是MIT耗时一年提出的研究成果,名为Ithemal,核心功能 ...

  9. 这是一个有趣的问题,Java 8 Lambda 表达式被编译成了什么?

    在了解了Java 8 Lambda的一些基本概念和应用后, 我们会有这样的一个问题: Lambda表达式被编译成了什么? 这是一个有趣的问题,涉及到JDK的具体的实现.本文将介绍OpenJDK对Lam ...

最新文章

  1. 一次谷歌面试趣事(转)
  2. 栈----迷宫(Maze)
  3. yolov5 多版本共存
  4. Spring MVC之@RequestMapping 详解
  5. php实现电话拨打,jquery mobile实现拨打电话功能的几种方法_jquery
  6. CSS 布局与“仓库管理”的关系
  7. linux shell 网盘,linux在shell中获取时间
  8. alwayson高可用组_AlwaysOn可用性组–如何在集群实例和独立实例之间设置AG(第3部分)
  9. 扫地机器人滤网顺序_扫地机器人如何维护 扫地机器人维护技巧【介绍】
  10. 查看linux的iso文件名,查看ISO文件信息
  11. 直播app源码,跳转站外链接或平台内部跳转页面
  12. 游戏项目导出AAB包上传谷歌提示超过150M的解决方案
  13. 【Errors】Errors during downloading metadata for repository ‘AppStream‘:
  14. 2009年中国各省人均GDP排名(鄂尔多斯人均GDP将很有可能超过两万美元,全国第一)...
  15. 一文总结图像生成必备经典模型(二)
  16. 埃尼阿克计算机怎么运行的
  17. 怎么看台式计算机的屏幕大小,如何在计算机上查看显示器尺寸win10
  18. 访问使用https协议的网址时,浏览器地址栏没有显示“安全锁”的标志的问题
  19. python中continue的用法_关于Python中continue用法问题
  20. Mac开发利器之程序员编辑器MacVim

热门文章

  1. 量子计算机编程原理简介 和 机器学习
  2. 完全图解RNN、RNN变体、Seq2Seq、Attention机制
  3. Python做文本挖掘的情感极性分析
  4. 人生最浪费生命的四件事,2017年别再做了!
  5. eclipse 快捷键大全,eclipse查找类,文件,添加注释
  6. 没好域名?就得给自己换个名
  7. Java Review - PriorityQueue源码解读
  8. Spring MVC-03循序渐进之Spring MVC
  9. Spring JDBC-事务方法嵌套调用解读
  10. Android日期分组,按查询分组在列表视图android中显示一些意...