`
isiqi
  • 浏览: 16490693 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

与64位机的第一次亲密接触

 
阅读更多

今天阳光明媚,我与64位有个约会。

约会内容如下:

首先,main中创建producer和consumer两个线程,然后等待两个线程执行完毕。

理论上讲,屏幕上依次会输出


Point 1
Point 2
Point 3

Unfortunately,代码在打印出Point 2后Segment Fault Core掉了,我将两个pthraed_join()交换位置,变成下面的样子:

fprintf(stderr,"Point 2/n");
pthread_join(consumer, (void *)&result);

fprintf(stderr, "Point 1/n");
pthread_join(producer, (void *)&result);

这次居然没有core。。。莫非,pthread_join和pthread_create还有顺序对应关系?不应该呀!man pthread_join看了下,没有相关注意事项,那么,有点囧了……

考虑到我是在实验室,莫非……莫非……于是在代码前面加了这么一句:

printf("int size: %d, void* size:%d/n", sizeof(int), sizeof(void*));

shit!输出为:

int size: 4

void* size: 8

囧,问题找到~ 原来这是个64位机器,int 和pointer的大小不一样了。

堆栈Layout如下:

main args Hi

pthread_t producer
pthread_t consumer
intresult Lo

第一个pthread_join会向result所在的堆栈处写数据(这里为全0),数据长度为8字节,于是乎,consumer的内容被破坏了,后面的pthread_join使用的consumer指针也就变成非法了。core之~~

如何避免这个问题呢?最自然的方法就是改变result的定义:

long result;

long和void*都是占8字节。

还有个搞着玩的方法,仅仅这段代码中适用,那就是改变consumer和producer的定义顺序:

pthread_t consumer;

pthread_t producer;
为什么呢?调用pthread_join()等待producer,返回后producer的内容会被result覆盖掉,恰好producer再也不会被使用了,坏了也就坏了。但是consumer还健在,下一个pthread_join照常执行。经过验证,OK~ 这个道理跟上面交换两个pthread_join的顺序是相通的。

----

我养的太阳花还没见发芽,然而那一盆土上已经长出了五颜六色的草儿,每天清晨趴在床头看一看,也是十分的赏心悦目呢~~

分享到:
评论

相关推荐

    与Android Studio的第一次亲密接触学习笔记

    与Android Studio的第一次亲密接触学习笔记

    考研第一次亲密接触

    考研第一次亲密接触

    001我和Python的第一次亲密接触

    001我和Python的第一次亲密接触

    和EVA的第一次亲密接触

    ### 和EVA的第一次亲密接触:HP EVA阵列配置详解 #### HP EVA阵列简介 HP EVA(Enterprise Virtual Array)系列磁盘阵列是HP存储产品线中的重要组成部分,位于VA与XP系列之间,主要面向企业级存储需求。EVA系列支持...

    《第一次亲密接触》读后感.doc

    《第一次亲密接触》是网络文学的经典之作,以其独特的叙事方式和深情的爱情故事赢得了广大读者的喜爱。这本书不仅仅是一篇小说,更是许多人心中的情感共鸣。它讲述了在网络世界中发生的浪漫而又带有淡淡哀伤的爱情...

    第一次亲密接触ASP.Net

    本教程旨在为初学者提供一个全面的入门指南,帮助你们第一次亲密接触ASP.NET,了解其基本概念、架构以及如何使用它来创建动态网页。 首先,我们要理解ASP.NET的核心概念。ASP.NET是一种服务器端技术,它在服务器上...

    云计算入门无忧:第一次亲密接触

    云计算入门无忧:第一次亲密接触 背景 什么是云计算 云计算的部署方式 从部署方式来说,总共有两类云计算: 云计算的特征 1、软件及硬件都是资源 2、这些资源都可以根据需要动态的配置和扩展 3、这些资源在物理上都...

    692712394870428001我和Python的第一次亲密接触.zip

    《我和Python的第一次亲密接触》 在这个压缩包中,我们找到了两份文件,分别是"鱼C资源打包合集.htm"和"001我和Python的第一次亲密接触"。虽然标签部分为空,但从文件名我们可以推测这是一份关于初学者学习Python...

    《ADO第一次亲密接触》

    **《ADO第一次亲密接触》——深入理解数据库连接技术** ADO(ActiveX Data Objects)是Microsoft开发的一种用于访问数据库的应用程序接口,它为开发者提供了一种简单而强大的方式来与各种数据库进行交互。在本资料...

    lucene之第一次亲密接触

    《Lucene之第一次亲密接触》 Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发并维护。它是Java编写,被广泛应用于各种搜索引擎的构建,包括网站搜索、文档检索、甚至电子邮件过滤等场景。这篇博客将带领...

    1与Linux的第一次亲密接触1

    Linux并非只限于32位x86架构,随着时间的发展,Linux已经能够在多种处理器架构上运行,包括32位和64位变体。这得益于其高度的可移植性,只要目标架构拥有分页内存管理单元(PMMU)和GNU C编译器(GCC)的支持,Linux...

    Go语言的第一次亲密接触-Hello, Go!-Markdown文档.zip

    Go语言的第一次亲密接触——Hello, Go! 亲爱的编程爱好者们, 你是否厌倦了日复一日的重复工作,渴望寻找一种更高效、更简洁的编程语言来释放你的创造力?那么,不妨来尝试一下Go语言吧! 在这个飞速发展的互联网...

    第一次亲密接触作文.doc

    这篇文档实际上是一篇个人旅行经历的作文,标题和描述中并未明确包含具体IT知识点,但从内容中我们可以提炼出一些与文化、人情和生活智慧相关的主题,这些在IT行业中同样重要,尤其是对于团队协作和跨文化交流时的...

    ADO第一次亲密接触 教会你用ado

    ### ADO第一次亲密接触:详解ADO使用方法 #### 一、引言 ADO(ActiveX Data Object)是Microsoft提供的一种用于访问数据的技术,它在OLE DB的基础上进一步简化了数据库访问的过程,使得开发者能够更加轻松地操作...

    商业编程-源码-《ADO第一次亲密接触 -- ADO开发实践之一》配套源代码.zip

    《ADO第一次亲密接触 -- ADO开发实践之一》的配套源代码是针对初学者和开发者深入理解ActiveX Data Objects(ADO)的重要参考资料。ADO是Microsoft提供的一种数据访问接口,用于简化数据库应用程序的开发,尤其在...

    WebService第N次亲密接触

    【WebService第N次亲密接触】 WebService是一种基于互联网的、平台无关的分布式应用程序交互技术,它允许不同的系统之间通过网络进行数据交换和业务协同。在Web服务的世界里,XML(Extensible Markup Language)...

    2011-考研第一次亲密接触-@谷月K.ppt

    【考研概况:第一次认识考研】 全国硕士研究生入学统一考试,简称考研,是中国内地高等教育中一项重要的选拔性考试,旨在选拔优秀的本科毕业生进入硕士研究生阶段学习。报名、初试和复试是整个考研流程的关键环节。...

    云计算入门无忧:第一次亲密接触(带目录)

    云计算是一种基于互联网的计算方式,它能够动态伸缩提供虚拟化的资源,并以服务的形式提供给用户。用户通过网络使用这些资源,而无需管理底层基础设施。云计算的概念可以追溯到互联网技术早期,人们用云的形状来表示...

    《第一次亲密接触》读后感

    《第一次亲密接触》是网络文学的经典之作,由蔡智恒创作,讲述了主人公痞子蔡与轻舞飞扬之间网络情缘的故事。这篇读后感主要探讨的是读者对这部作品的情感体验、主题理解以及它在现代网络文化中的地位。 首先,从...

Global site tag (gtag.js) - Google Analytics