今天阳光明媚,我与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的第一次亲密接触学习笔记
考研第一次亲密接触
001我和Python的第一次亲密接触
### 和EVA的第一次亲密接触:HP EVA阵列配置详解 #### HP EVA阵列简介 HP EVA(Enterprise Virtual Array)系列磁盘阵列是HP存储产品线中的重要组成部分,位于VA与XP系列之间,主要面向企业级存储需求。EVA系列支持...
《第一次亲密接触》是网络文学的经典之作,以其独特的叙事方式和深情的爱情故事赢得了广大读者的喜爱。这本书不仅仅是一篇小说,更是许多人心中的情感共鸣。它讲述了在网络世界中发生的浪漫而又带有淡淡哀伤的爱情...
本教程旨在为初学者提供一个全面的入门指南,帮助你们第一次亲密接触ASP.NET,了解其基本概念、架构以及如何使用它来创建动态网页。 首先,我们要理解ASP.NET的核心概念。ASP.NET是一种服务器端技术,它在服务器上...
云计算入门无忧:第一次亲密接触 背景 什么是云计算 云计算的部署方式 从部署方式来说,总共有两类云计算: 云计算的特征 1、软件及硬件都是资源 2、这些资源都可以根据需要动态的配置和扩展 3、这些资源在物理上都...
《我和Python的第一次亲密接触》 在这个压缩包中,我们找到了两份文件,分别是"鱼C资源打包合集.htm"和"001我和Python的第一次亲密接触"。虽然标签部分为空,但从文件名我们可以推测这是一份关于初学者学习Python...
**《ADO第一次亲密接触》——深入理解数据库连接技术** ADO(ActiveX Data Objects)是Microsoft开发的一种用于访问数据库的应用程序接口,它为开发者提供了一种简单而强大的方式来与各种数据库进行交互。在本资料...
《Lucene之第一次亲密接触》 Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发并维护。它是Java编写,被广泛应用于各种搜索引擎的构建,包括网站搜索、文档检索、甚至电子邮件过滤等场景。这篇博客将带领...
Linux并非只限于32位x86架构,随着时间的发展,Linux已经能够在多种处理器架构上运行,包括32位和64位变体。这得益于其高度的可移植性,只要目标架构拥有分页内存管理单元(PMMU)和GNU C编译器(GCC)的支持,Linux...
Go语言的第一次亲密接触——Hello, Go! 亲爱的编程爱好者们, 你是否厌倦了日复一日的重复工作,渴望寻找一种更高效、更简洁的编程语言来释放你的创造力?那么,不妨来尝试一下Go语言吧! 在这个飞速发展的互联网...
这篇文档实际上是一篇个人旅行经历的作文,标题和描述中并未明确包含具体IT知识点,但从内容中我们可以提炼出一些与文化、人情和生活智慧相关的主题,这些在IT行业中同样重要,尤其是对于团队协作和跨文化交流时的...
### ADO第一次亲密接触:详解ADO使用方法 #### 一、引言 ADO(ActiveX Data Object)是Microsoft提供的一种用于访问数据的技术,它在OLE DB的基础上进一步简化了数据库访问的过程,使得开发者能够更加轻松地操作...
《ADO第一次亲密接触 -- ADO开发实践之一》的配套源代码是针对初学者和开发者深入理解ActiveX Data Objects(ADO)的重要参考资料。ADO是Microsoft提供的一种数据访问接口,用于简化数据库应用程序的开发,尤其在...
【WebService第N次亲密接触】 WebService是一种基于互联网的、平台无关的分布式应用程序交互技术,它允许不同的系统之间通过网络进行数据交换和业务协同。在Web服务的世界里,XML(Extensible Markup Language)...
【考研概况:第一次认识考研】 全国硕士研究生入学统一考试,简称考研,是中国内地高等教育中一项重要的选拔性考试,旨在选拔优秀的本科毕业生进入硕士研究生阶段学习。报名、初试和复试是整个考研流程的关键环节。...
云计算是一种基于互联网的计算方式,它能够动态伸缩提供虚拟化的资源,并以服务的形式提供给用户。用户通过网络使用这些资源,而无需管理底层基础设施。云计算的概念可以追溯到互联网技术早期,人们用云的形状来表示...
《第一次亲密接触》是网络文学的经典之作,由蔡智恒创作,讲述了主人公痞子蔡与轻舞飞扬之间网络情缘的故事。这篇读后感主要探讨的是读者对这部作品的情感体验、主题理解以及它在现代网络文化中的地位。 首先,从...