调用 gcc _without_ -pthread 有啥好处?

Posted

技术标签:

【中文标题】调用 gcc _without_ -pthread 有啥好处?【英文标题】:Any advantage to invoking gcc _without_ -pthread?调用 gcc _without_ -pthread 有什么好处? 【发布时间】:2016-03-18 08:52:40 【问题描述】:

我们知道添加-pthreadmakes GCC use reentrant/thread-safe code(编译C/C++代码时)。虽然我猜这是真的,但如果您允许不可重入,您可能会在这里和那里节省几个周期 - 我想知道 总是指定 -pthread 是否有任何实际优势。有吗?

【问题讨论】:

生成的代码无论如何都不能重入?我不知道 gcc 使用起来非常不安全。 ..或者你只是说图书馆?我可以理解:) @MartinJames:我的意思是链接中描述的意思。 #define REENTRANT 取决于 -lpthread。我不确定到底发生了什么变化。但这里的答案已经提供了一个重要的例子。 【参考方案1】:

一个例子:std::shared_ptrdoesn't use locking when compiled without -pthread 的 libstdc++ 实现,如果您在单线程环境中大量使用共享指针,它可以大大提高性能。

【讨论】:

【参考方案2】:

在 c++ 中,该语言的理念一直是“您无需为不需要的东西付费”。如果您的程序运行单线程并且不需要可重入函数,则没有真正的动机添加-pthread

使用可重入函数的成本总是会高于或等于函数的不可重入版本。要么及时(您必须锁定互斥锁以保护变量),要么为每个函数调用分配内存,而不是使用静态缓冲区。

此外,某些平台可能没有pthreads 实现(pthreads 毕竟是 POSIX 的东西)。

【讨论】:

我看不出它是如何回答这个问题的。 @YSC:实际上我认为这是一个有效的观点。强制您重入将是“方法上的不一致”。这种一致性是一种好处。 @YSC :确实,我可以更清楚地说明,使用某些函数的可重入版本(例如,strok 和 strok_r)总是会产生性能成本,因此如果您不需要 pthread(并且性能是一个问题),您可能不想使用它。 OP 已经知道了。详细信息有望得到一个好的答案。 嗯...第 (1) 和 (3) 段与问题无关。第 (2) 段涉及该主题,但暗示 -pthread 强制重入(并且会影响性​​能),这需要某种证据或至少是一个体面的例子,IMO。

以上是关于调用 gcc _without_ -pthread 有啥好处?的主要内容,如果未能解决你的问题,请参考以下文章

使用内联汇编器从 GCC 中的共享库调用函数

相当于 gcc 的 __attribute__(cleanup) 的便携式

如何在 GCC (x86_64) 中使用内联汇编进行相对跳转/调用

将 SessionId 转换为用户帐户 SID _without_ WTSQuerySessionInformation?

为什么gcc不能虚拟化这个函数调用?

gcc/g++编译过程system系统调用过程