为什么C++11 中的thread还要添加-pthread???

flying_music 2021-01-30 06:05:17
为什标准中支持的多线程还要添加pthread链接的选项呢?pthread不是posix中的库吗,这是什么操作?
...全文
1594 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
实现方法不同吧。vc是不是就不用。
赵4老师 2021-02-02
  • 打赏
  • 举报
回复
存在即合理
forever74 2021-02-02
  • 打赏
  • 举报
回复
科学才追求极致 工程充满了妥协
  • 打赏
  • 举报
回复
首先,不是一个库,尤其pthread是C库,为什么要合并到C++库中
其次,在Linux/Unix的GCC实现中,std::thread应该内部使用了pthread库

「已注销」 2021-02-02
  • 打赏
  • 举报
回复
学到了,点赞支持,一起加油 (ง •̀o•́)ง (ง •̀o•́)ง2
flying_music 2021-02-02
  • 打赏
  • 举报
回复
引用 19 楼 太刀一筋 的回复:
std::thread A thread of execution is a sequence of instructions that can be executed concurrently with other such sequences in multithreading environments, while sharing a same address space. 按我的理解:C++标准库中std::thread只是对线程api做了统一的封装,其真实的实现其实是依赖具体的操作系统。在linux/unix中底层依赖pthread, 在windows里面依赖winthread等等。 使用std::thread的好处是你的代码不用改,但是在编译程序的时候依然要链接对应操作系统的库
嗯是的,标准只是规定了一套统一接口,具体是系统自己实现的。而linux中也没有“标准相关的库都默认链接”这种传统,所以就出现了即便标准支持了某个东西,你还是要手动去链接一个对应的库,这并不是多线程有啥技术特殊性导致的,linux一直都是这么干的。以前有,现在有,后面新的标准出来了可能还会有。
太刀一筋 2021-02-02
  • 打赏
  • 举报
回复 1
std::thread A thread of execution is a sequence of instructions that can be executed concurrently with other such sequences in multithreading environments, while sharing a same address space. 按我的理解:C++标准库中std::thread只是对线程api做了统一的封装,其真实的实现其实是依赖具体的操作系统。在linux/unix中底层依赖pthread, 在windows里面依赖winthread等等。 使用std::thread的好处是你的代码不用改,但是在编译程序的时候依然要链接对应操作系统的库
flying_music 2021-02-02
  • 打赏
  • 举报
回复
引用 15 楼 早打大打打核战争 的回复:
首先,不是一个库,尤其pthread是C库,为什么要合并到C++库中 其次,在Linux/Unix的GCC实现中,std::thread应该内部使用了pthread库
我之前理解有问题,libstdc++跟标准并不是一一对应的,标准里的东西还可以放到其他库中,最常见的就是math.h中的,放到了m库中,而且最开始gcc默认也不链接这个库,这就是为什么好多工程项目里有-lm选项的原因,不过现在的gcc已经默认链接这个库了(我用的4.8.5) 所以pthread现在要手动链接,只是g++现在没有默认链接这个库而已,以后新的版本可能就默认链接了 总之,标准可能放到多个库中,这些库也不一定默认链接,linux一直是这么来的
赵4老师 2021-02-01
  • 打赏
  • 举报
回复
引用 5 楼 forever74 的回复:
年轻的夫妻生娃之前就要给娃取名字,理论上法律不允许鉴定胎儿性别,所以要分别准备个男孩名字和女孩名字,按需调用。 标准库也是这样,不知道你要写单线程代码还是多线程代码,所以就准备了两套库函数。 你加那个参数无非是告诉编译器,你生的是女孩。 瞧,没啥不标准的,不要自己吓唬自己。
万一生个N胞胎呢?
赵4老师 2021-02-01
  • 打赏
  • 举报
回复
编译器是人做出来的,不是神做出来的,可以上下知几百年。
  • 打赏
  • 举报
回复
因为C++继承了C的一个缺点:单元之间没有明确的引用关系,虽然你用了std::thread,但是std::thread的代码和它依赖的代码被编译到哪些obj(lib是obj的合集)中,链接器并不知道,必须你手工添加依赖的库,链接器要在这些库的obj中搜索对应的符号才能找到(或者找不到报错)。所以后来几乎所有的语言都使用一种引用链技术,不管关键字叫啥,uses、 using、import等等,原理是一样的,一个单元只跟它引用的单元发生关系,不在本单元定义的符号,编译器或者链接器知道去哪找。
forever74 2021-02-01
  • 打赏
  • 举报
回复
好吧,理解并支持你,你说的都对。
flying_music 2021-02-01
  • 打赏
  • 举报
回复
引用 5 楼 forever74 的回复:
年轻的夫妻生娃之前就要给娃取名字,理论上法律不允许鉴定胎儿性别,所以要分别准备个男孩名字和女孩名字,按需调用。 标准库也是这样,不知道你要写单线程代码还是多线程代码,所以就准备了两套库函数。 你加那个参数无非是告诉编译器,你生的是女孩。 瞧,没啥不标准的,不要自己吓唬自己。
我用了std::thread不就说明我要用多线程吗?而且不加就编译不过去啊,既然编译器能检测到缺少那个库,自己去链接不就可以了吗?
flying_music 2021-02-01
  • 打赏
  • 举报
回复
引用 4 楼 赵4老师 的回复:
哪个c/c++编译器不需要用户告诉链接多线程库?
都需要是事情的结果,不是原因啊,为啥标准库能包含std::cout,就不能包含std::thread呢?后来的就要区别对待吗?还是用的人少?占用的空间大?以后标准再支持一个新特性是不是又要链接一个新的库?那标准库的意义何在呢?
flying_music 2021-02-01
  • 打赏
  • 举报
回复
引用 13 楼 赵4老师 的回复:
[quote=引用 12 楼 flying_music 的回复:][quote=引用 9 楼 早打大打打核战争 的回复:]因为C++继承了C的一个缺点:单元之间没有明确的引用关系,虽然你用了std::thread,但是std::thread的代码和它依赖的代码被编译到哪些obj(lib是obj的合集)中,链接器并不知道,必须你手工添加依赖的库,链接器要在这些库的obj中搜索对应的符号才能找到(或者找不到报错)。所以后来几乎所有的语言都使用一种引用链技术,不管关键字叫啥,uses、 using、import等等,原理是一样的,一个单元只跟它引用的单元发生关系,不在本单元定义的符号,编译器或者链接器知道去哪找。
你说的这个分离式编译我理解,其实我不了解的地方还是为啥不把libpthread.so 合并到 libstdc++.so中,应该是GNU这些大牛有更多考虑吧,但这么做会抛给不了解情况的用户一个运行时错误,实在是太不优雅了。[/quote] 待你将来了解了“多线程”和“模板库”有多风马牛不相及之后就会原谅GNU大牛的不优雅和你自己的无知无畏了。[/quote] C++前面,谁都是无知的,现在不会还有人觉得自己精通C++吧?但关于这一点,我是只看到了这么设计的弊端,没看好处,如果有人知道,那请告诉我,如果大家都看不到,那就成皇帝的新装了
赵4老师 2021-02-01
  • 打赏
  • 举报
回复
引用 12 楼 flying_music 的回复:
[quote=引用 9 楼 早打大打打核战争 的回复:]因为C++继承了C的一个缺点:单元之间没有明确的引用关系,虽然你用了std::thread,但是std::thread的代码和它依赖的代码被编译到哪些obj(lib是obj的合集)中,链接器并不知道,必须你手工添加依赖的库,链接器要在这些库的obj中搜索对应的符号才能找到(或者找不到报错)。所以后来几乎所有的语言都使用一种引用链技术,不管关键字叫啥,uses、 using、import等等,原理是一样的,一个单元只跟它引用的单元发生关系,不在本单元定义的符号,编译器或者链接器知道去哪找。
你说的这个分离式编译我理解,其实我不了解的地方还是为啥不把libpthread.so 合并到 libstdc++.so中,应该是GNU这些大牛有更多考虑吧,但这么做会抛给不了解情况的用户一个运行时错误,实在是太不优雅了。[/quote] 待你将来了解了“多线程”和“模板库”有多风马牛不相及之后就会原谅GNU大牛的不优雅和你自己的无知无畏了。
flying_music 2021-02-01
  • 打赏
  • 举报
回复
引用 9 楼 早打大打打核战争 的回复:
因为C++继承了C的一个缺点:单元之间没有明确的引用关系,虽然你用了std::thread,但是std::thread的代码和它依赖的代码被编译到哪些obj(lib是obj的合集)中,链接器并不知道,必须你手工添加依赖的库,链接器要在这些库的obj中搜索对应的符号才能找到(或者找不到报错)。所以后来几乎所有的语言都使用一种引用链技术,不管关键字叫啥,uses、 using、import等等,原理是一样的,一个单元只跟它引用的单元发生关系,不在本单元定义的符号,编译器或者链接器知道去哪找。
你说的这个分离式编译我理解,其实我不了解的地方还是为啥不把libpthread.so 合并到 libstdc++.so中,应该是GNU这些大牛有更多考虑吧,但这么做会抛给不了解情况的用户一个运行时错误,实在是太不优雅了。
forever74 2021-01-31
  • 打赏
  • 举报
回复
年轻的夫妻生娃之前就要给娃取名字,理论上法律不允许鉴定胎儿性别,所以要分别准备个男孩名字和女孩名字,按需调用。 标准库也是这样,不知道你要写单线程代码还是多线程代码,所以就准备了两套库函数。 你加那个参数无非是告诉编译器,你生的是女孩。 瞧,没啥不标准的,不要自己吓唬自己。
赵4老师 2021-01-31
  • 打赏
  • 举报
回复
哪个c/c++编译器不需要用户告诉链接多线程库?
flying_music 2021-01-31
  • 打赏
  • 举报
回复
引用 1 楼 赵4老师 的回复:
-pthread不是指定链接哪个库;而是指定链接支持多线程的库
为啥不直接放到C++的标准库里呢,不是标准支持的东西都应该放到标准库里吗?为啥要特殊对待,还要让用户告诉编译器链接多线程库??
加载更多回复(2)

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧