编译程序加不加 -lpthread 的区别【转】

【PMP认证考试之个人总结】第 4 章 项目范围管理 第 4 章 项目范围管理 4.1 综述   1.产品范围和项目范围的区别 ①产品范围:某项产品、服务或成果所具有的特性和功能; ②项目范围:为交付具有规定特性与功能的产品、服务或成果而必须完成的工作; 2.收集需求、定义范围和创建WBS输出的区别 ①收集需求 ===> 需求跟踪矩阵; ②定义范围 ===> 项目范围说明书; 阅读详情

转自:http://www.cnblogs.com/Swartz/articles/3939382.html

作者:Lokki 出处:http://www.cnblogs.com/Swartz/ 欢迎转载,也请保留这段声明。谢谢!

 

讨论贴


 

最近在优快云上看到一个帖子在讨论 进程间共享的Posix mutex的锁定状态能否被子进程继承?,其中4楼的帖子给出了一个测试局部mutex能否被继承的例子:

复制代码
复制代码
 1 #include <pthread.h>
 2 #include <stdio.h>
 3 #include <stdlib.h>
 4 #include <unistd.h>
 5 
 6 int main(void)  7 {  8  pid_t pid;  9  pthread_mutex_t mut; 10 11 pthread_mutex_init(&mut, NULL); 12 13 printf("lock\n"); 14 pthread_mutex_lock(&mut); 15 16 printf("fork\n"); 17 pid = fork(); 18 if( pid == 0 ) // 子进程尝试锁定 19  { 20 printf("child: lock\n"); 21 pthread_mutex_lock(&mut); 22 printf("child: over\n"); 23 24 exit(0); 25  } 26 27 pthread_mutex_destroy(&mut); 28 return(0); 29 }
复制代码
复制代码

 在之后的楼层讨论,大家发现在编译以上代码时候加 -lpthread 和不加 -lpthread 得出了截然不同的结果。这是为什么呢?

1 gcc -o test1 main.c -lpthread
2 gcc -o test2 main.c

 

本文主要讨论动态链接编译的方式。

 

为什么加不加 -lpthread 都可以编译通过且成功执行


 

由于程序正确地添加了头文件 pthread.h,所以在编译的链接阶段之前,加不加 -lpthread 生成的目标文件是没有区别的,区别在于编译阶段的链接过程。程序里面的pthread_mutex_init pthread_mutex_lock 等函数(事实上除了main函数之外的函数都是)是未定义的符号。编译器需要在链接期间的正确地解析未定义符号的地址。那么对于test2中的pthread_mutex_lock函数,连接器能正确解析到吗?我们先来看一下test1和test2都链接了哪些动态库(注意链接库的顺序)。

很显然,test2链接的动态库里面没有pthread。我们看一下libc.so里面的符号是不是有pthread_mutex_lock函数。

原来在libc.so库里面有这些函数,这样test2就可以正确编译执行了。

 

为什么程序运行的结果不一样?


 

在我们执行两个程序之后得到以下结果:

显然,test1的结果表明了局部mutex的状态可以被子进程继承,test2的结果却恰恰相反。这是因为test1调用的pthread_mutex_*函数是来自于pthread库,test2调用的函数来自libc.so库。libc.so库里面的pthread_mutex_*函数什么都没有做,只是返回了0。这样就会出现上述结果。

 

为什么libc要定义一些多线程的函数?


 

我们再次查看libc.so定义的pthread有关的函数时候,可以找到很多熟悉的函数(没有pthread_create,为什么?)。

libc之所以这样做是因为一些库需要做到线程安全,但是自身却不使用线程。试想,一个库的函数需要使用mutex,当该函数调用时候需要lock和unlock。这样在程序为单线程时候不必链接pthread库这个函数仍然可以正常调用,事实上lock和unlock的动作不会有任何效果。在多线程时候,程序链接了pthread库,这样函数就可以正常地lock和unlock,实现线程安全的特性。

例如,根据posix标准,你每次调用fputc(ch, stream)都会有mutex的lock和unlock。

 

如何保证调用到有效的pthread函数?


 
1. 对于动态链接的程序

通过符号介入。符号介入是指:在动态链接时候,如果一个符号在多个库里面有定义,那么连接器将使用它第一次找到的版本。看第一个图,我们可以看到libpthread的链接顺序要比libc靠前,默认情况下libc都排在编译器链接顺序的最后一位。这样的话,如果程序没有链接pthread库,那么程序会调用libc的pthread函数。如果程序链接了pthread库,由于pthread的链接顺序总是排在libc之前,程序会调用pthread的函数。

 

2. 对于静态链接的程序

之前我们讨论的是动态链接的程序,其中涉及到了动态链接符号的解析,由于静态链接程序没有这个步骤,所以静态链接程序不能通过这个来实现。我们可以看一下libc.a里面的pthread函数:

很明显,pthread的相关函数都被定义为了弱符号,而这些函数在libpthread.a里面都被定义为强符号。这样在程序链接pthread时候会调用pthread的强符号,没有链接pthread时候会调用libc定义的函数。

 

3. 符号版本的作用

情况比较少,暂时忽略

 

后记


 

通过对现象的深入剖析,看到了libc库的强大。事实上,libc除了pthread相关函数还实现了其他的一些函数,这些函数称为stubs。他们不会实现实际的功能,只是一个占位符(place holder),当有真正的函数可用时候,他们就会让出自己的位置。

GUN对stub的描述:

A stub function is a function which cannot be implemented on a particular machine or operating system. Stub functions always return an error, and set errno to ENOSYS (Function not implemented). See Error Reporting. If you define a stub function, you must place the statement stub_warning(function), where function is the name of your function, after its definition. This causes the function to be listed in the installed <gnu/stubs.h>, and makes GNU ld warn when the function is used.

 

参考


 

  1. http://stackoverflow.com/questions/6266183/does-linking-an-lpthread-changes-application-behaviour-linux-glibc
  2. http://stackoverflow.com/questions/21092601/is-pthread-in-glibc-so-implemented-by-weak-symbol-to-provide-pthread-stub-functi
  3. http://stackoverflow.com/questions/11161462/why-glibc-and-pthread-library-both-defined-same-apis/11210463#11210463
  4. http://stackoverflow.com/questions/21092601/is-pthread-in-glibc-so-implemented-by-weak-symbol-to-provide-pthread-stub-functi
  5. http://www.gnu.org/software/libc/manual/html_node/Porting.html
doris2.1.8连接报错ERROR 1203 (42000): Reach limit of connections解决办法 摘要:客户Doris数据库报错"ERROR 1203 (42000): Reach limit of connections"的解决过程。发现AI提供的解决方案存在错误:1)查询命令应为SHOW FRONTEND CONFIG而非show variables;2)参数名称应为qe_max_connection而非max_connections。正确解决步骤:1)用admin账户登录查看连接数限制和当前连接数;2)通过SHOW PROPERTY命令检查用户资源限制;3)针对不同情况修改参数 阅读详情

相关推荐

Ansys Circuit新手必看:IBIS模型导入时,Pin Import和Buffer Import到底怎么选?

本文详细解析了Ansys Circuit中IBIS模型导入时Pin Import与Buffer Import的选择策略,帮助SI/PI工程师根据仿真需求做出正确决策。通过对比两种方式的特性差异和应用场景,提供实用的选择指南和性能优化建议,提升信号完整性仿真效率。

weixin_26846533的博客 260

linux gcc lpthread,Linux程序链接时-lpthread对程序正确性的影响

理论上来说,多线程程序在链接时应该加上-lpthread或者-pthread。实际上很多时候忘记加这个也能链接过去,最近我线上的一个重要服务经常卡死,CPU使用率很高。用pstack看,经常是停留在这样的地方:# 0x0000003a21e0e054 in __lll_lock_wait () from /lib64/libpthread.so.0#10x0000003a21e0bca1 in ...

weixin_31548723的博客 453

关于MOS管栅极和栅介质(氧化物)的材料选择

大概解释了高K材料作为栅介质的好处,以及为什么会带来好处,同时引出了金属栅的优点,总结了使用高K材料和金属栅的原因。

qq_52054477的博客 1万+

Linux下CMake中使用pthread多线程编程调试教程及错误分析

文章目录VS Code插件CMakeLists编写编译调试第一步,debug第二步,kit第三步,Build执行问题分析 Linux下编写多线程的程序,需要使用到pthread.c库,使用gcc编译,不能直接 gcc product.c -o product 而是需要在命令的后面添加一个命令,gcc在编译的时候通过 -L参数 手动指定的搜索路径 gcc product.c -o product -lpthread 所以,对于调试过程,也要进行这个的静态库的调用,现在的问题就是如何在cmake中添加静

“逛丢一只鞋”的博客 5987

RT-Thread stm32h7使用串口DMA

stm32h7在rtthread中无法使用串口DMA,通过更改驱动代码使其支持串口DMA

qq_35141454的博客 2285

深度探索:机器学习中的最大似然估计(MLE)原理及其应用

最大似然估计作为统计推断的核心方法,在机器学习领域具有广泛的应用价值和深远影响。尽管存在对模型假设敏感、易受异常值影响等局限性,但其直观的原理、坚实的理论基础以及高效的实现方式使其在实践中仍占据主导地位。随着深度学习、强化学习等新兴领域的快速发展,最大似然估计将继续演化并适应新的模型结构与优化框架。同时,结合现代优化算法、并行计算技术以及贝叶斯方法的融合,最大似然估计有望在保持其核心优势的同时,进一步提升参数估计的准确性和鲁棒性,为未来的机器学习研究与应用开辟更广阔的道路。

qq_51320133的博客 1万+

gcc中-pthread和-lpthread的区别

用gcc编译使用了POSIX thread的程序时通常需要加额外的选项,以便使用thread-safe的库及头文件,一些老的书里说直接增加链接选项 -lpthread 就可以了而gcc手册里则指出应该在编译和链接时都增加 -pthread 选项编译选项中指定 -pthread 会附加一个宏定义 -D_REENTRANT,该宏会导致 libc 头文件选择那些thread-safe的实现;链接选项中指...

pigff的博客 1801

UG NX二次开发(C#)-外部模式-批量删除某些图层中的体对象和曲线对象

在 UG NX中,有时需要批量删除某文件夹下多个.prt文件中固定一些图层中的体对象和曲线对象,这时如果采用手动逐个打开模型,并选择针对的图层删除,即耗时也容易遗漏,因此采用外部模式来处理比较方便。本文介绍批量删除某些图层中的体对象和曲线对象。

GimiGimmy 3035

-lpthread和-pthread的区别

编译程序包括 预编译, 编译,汇编,链接,包含头文件了,仅能说明有了线程函数的声明, 但是还没有实现, 加上-lpthread是在链接阶段,链接这个库。pthread是动态库,需要用-lpthread,所有的动态库都需要用-lxxx来引用用gcc编译使用了POSIX thread的程序时通常需要加额外的选项,以便使用thread-safe的库及头文件,一些老的书里说直接增加链接选项 -lpthre...

孤独行者的专栏 2万+

手把手教你学simulink(44.1)--串励直流电动机场景示例:基于Simulink开发一个串励直流电动机电压控制仿真模型

高启动转矩:由于励磁绕组和电枢绕组串联连接,电机在启动时可以产生较大的转矩。速度随负载变化:由于励磁电流和电枢电流是同一电流,电机的速度会随着负载的变化而显著变化。适用于重载启动:适合用于需要高启动转矩的应用,如起重机、牵引系统等。

MHD0815的博客 340

SAM3 几行代码支持任意图像分辨率,减少显存占用(针对transformers库)

几行代码让sam3支持任意图像分辨率

qq_41234663的博客 156

字节成立大模型研究院,疯狂氪金 AI 人才

大模型成为字节的“重中之重”。AI 科技评论独家获悉,字节跳动正在秘密筹备成立大模型研究院,并积极招揽人才。知情人士称,已有外部 AI 大牛加入大模型研究院。此外,原序智科技创始人秦禹嘉、原零一万物核心成员黄文灏已加入字节大模型团队。目前暂不清楚是否归属在大模型研究院。从去年开始,字节才陆续对外公布关于大模型的相关工作进展。2023 年 8 月,字节自研的底层大模型「云雀」上线,随即推出 AI 对话产品「豆包」。

2401_84205765的博客 885

详细推导波特图增益和相位曲线

最近因为项目需求,在回看波特图方面的内容。大三那会,《自动控制原理》这本书里面就讲过这些东西,但是那时候总感觉学这些没啥用,反正以后也用不到,对这种课程的重视度不是很高。 工作后发现,只要你从事的是和本专业相关的工作,大学学过的很多理论课程在后面大概率都会用到。曾经那些我们在学校以为用不上的东西,熟不知在后面用处还多着呢。所以啊,仅仅只是我们的以为而已! 现在还在学校的同学,对待《自动控制理论》、《信号与系统》、《通信原理》这样的核心专业课,建议还是好好学习一下,认真听听课。哪怕是考试完以后就会忘掉,但当我

D_Katter的博客 3936

给读者朋友们提供的赠书活动

为了回馈读者朋友们的支持,杂货铺和爱可生开源社区一起,邀请广大开发者们参与《主理人荐书》活动,将有机会赢取《大智小技》系列图书(1-5 任选)一本。如下是这次活动的奖品和爱可生开源社区的介绍。《大智小技》介绍社区介绍爱可生开源社区,一个有深度的数据库开源社区。社区成立于 2017 年,由上海爱可生信息技术股份有限公司发起。以开源高质量的运维工具、日常分享技术干货内容、数据库技术布道为己任;目前...

bisal的专栏 195

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

红狐赤卫队(honghoo)正式成立了!

红狐赤卫队(honghoo)正式成立了! 1) 根据朋友们的建议,红狐赤卫队(honghoo)将由系列开源红狐项目组成 2) 项目的思路,文档,人员说明,进度报告将在这里公布;代码下载空间将在有正式版本后在文档中另行通知 3) 由本人发起的,已有组员三人,已完成一半功能的第一个红狐项目将在近日公开;该项目要求对hibernate非常熟悉,有一定业余时间,缺设计编码人员一名,满足条件的可以与hong

【洪波@阿里云】 2362

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

MapAspect开源项目正式启动

MapAspect开源项目正式启动 1) 根据朋友们的建议,红狐赤卫队(honghoo)将由系列开源红狐项目组成2) 项目的思路,文档,人员说明,进度报告将在这里公布;代码下载空间将在有正式版本后在文档中另行通知3) 由本人发起的,已有组员三人,已完成一半功能的第一个红狐项目将在近日公开;该项目要求对hibernate非常熟悉,有一定业余时间,缺设计编码人员一名,满足条件的可以与h

楼顶专栏 875

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

阿里成立智能搜索业务部;任天堂:共有30万账号被黑客入侵;TiDB 3.1.2 发布| 极客头条...

整理 | 屠敏头图 | 优快云 下载自东方 IC快来收听极客头条音频版吧,智能播报由出门问问「魔音工坊」提供技术支持。「极客头条」—— 技术人员的新闻圈!优快云 的读者朋友们早上好哇...

优快云资讯 3012

推荐个专注分享 Go 知识的大佬

大家好,我是杨文。很高兴认识大家,也很高兴在这里跟大家介绍自己。我是「Go 夜读」发起人,同时也是「Go 夜聊」的主播之一。Go、TiDB 等多个开源项目的 Contributor。推荐关...

EDDYCJY的博客 1482

消息称字节成立“大模型研究院”,知情人士回应;小米“无按键”旗舰手机被曝2025年亮相,代号“朱雀” | 极客头条

极客头条」—— 技术人员的新闻圈!

极客日报 2万+

KCC@西安首次线下活动圆满举办!

2024年6月2日上午,KCC@西安首次线下活动在雁塔区科技一路叁分贰咖啡馆举办。西安 KCC 的发起人郑旭、张一琛、开源爱好者马丁武、墨洺、张铭轩、徐晗博、杨月顺、肖科等一批来自职场和高校在读的朋友参加。在咖啡厅里,参会的朋友们以就开源文化进行了轻松愉快的交流,对开源文化和开源开发流程交换了彼此的经历和印象,并且进行了读书分享和开源项目介绍和演示等。活动概要首先,郑旭大家介绍了开源社的目标和定位...

开源社KAIYUANSHE的博客 772

openGauss荣获云计算标准和应用大会优秀开源项目奖

12月29日,由中国电子技术标准化研究院主办的第十届中国云计算标准和应用大会在北京举行。本次大会以“标准聚力 开源共赢”为主题,邀请到政产学研用各界代表汇聚一堂,聚焦“云计算赋能新基建”和“开源群智化创新”两大...

openGauss的博客 68

人人都可以参与开源!龙蜥社区最不容错过的开发者活动来了

你是否在苦恼如何踏出自己开源贡献的第一步?不担心,小龙给你造了龙蜥社区贡献直通车。你是否想零距离接触技术大神,与之切磋论道?放心来,小龙给你建龙蜥社区大神交流群。无论你对开源社区的诉求是啥?来龙蜥社区,就对了!All For One,One For All。龙蜥社区「人人都可以参与开源」活动正式上线啦!参与活动赢实习机会、丰厚龙蜥周边礼!其中,龙蜥社区也推出了征集令:社区......

weixin_60347558的博客 295

消息称字节成立“大模型研究院”,知情人士回应;小米“无按键”旗舰手机被曝2025年亮相,代号“朱雀” | 极客头条...

「极客头条」—— 技术人员的新闻圈!优快云 的读者朋友们好,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧。整理 | 郑丽媛出品 | 优快云(ID:优快云news)一分钟速览新闻点!字节被曝成立“大模型研究院”,知情人士称其“未决定建立独立机构”代号“朱雀”,小米“无按键”旗舰手机被曝 2025 年亮相业界首个 RISC-V 云计算试验平台“北海”发布11.98 万元起,...

优快云资讯 1914

AI推理基础设施领域新星:vLLM核心团队成立Inferact公司,获1.5亿美元融资,估值8亿美元!

vLLM核心团队成立Inferact公司,获1.5亿美元种子轮融资,估值8亿美元,由a16z和Lightspeed领投。作为开源推理引擎的事实标准,vLLM支持500+模型架构和200+加速器,团队承诺保持开源,加速技术发展并回馈社区。面对模型复杂度提升和硬件碎片化挑战,Inferact将专注于优化推理性能,推动AI基础设施进步。行业趋势显示,AI领域人才需求激增,薪资溢价显著,"技术+AI"成为职业升级关键路径。

2401_85325557的博客 1380

好家伙,尤雨溪创办公司啦!已融资3200万!

原文:https://voidzero.dev/posts/announcing-voidzero-inc整理:前端充电宝近日,Vue.js、Vite 作者尤雨溪宣布成立新公司:VoidZero,其旨在解决当前 JavaScript 工具链碎片化、依赖复杂以及性能瓶颈等问题,为开发者提供一个更加流畅和高效的开发体验。目前,公司已完成 460 万美元(折合人民币 3200 多万)种子轮融资。概要:V...

程序员小灰的博客 296
上一篇: EM算法(Expectation Maximization Algorithm)详解
下一篇: fatal error: nsync_cv.h: No such file or directory
青松愉快
博客等级 码龄14年 71粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值