linux - 链接 `-lpthread` 是否会改变应用程序行为? (Linux, Glibc)

标签 linux pthreads glibc

我有一个问题:如果我们有一个不使用线程的应用程序,我们可以通过两种方式链接它:

1) 照常链接,没有 -lpthread-ldl

2) 在链接中添加两个库:libpthread 和libdl。

例如

$ cat a.c
int main(){printf("Hehe");}
$ gcc a.c -w -o a
$ gcc a.c -w -o a1 -ldl -lpthread

默认情况下,两个库都是动态链接的:

$ ldd a
    linux-gate.so.1
    libc.so.6
    /lib/ld-linux.so.2
$ ldd a1
    linux-gate.so.1
    libdl.so.2
    libpthread.so.0
    libc.so.6
    /lib/ld-linux.so.2

版本a 和版本a1 之间会有多少差异?什么在应用程序本身和 int glibc 中以不同的方式工作? pthread 的链接是否会将内部的某些东西从线程不安全算法更改为线程安全算法?

例如

$ strace ./a 2>&1 |wc -l
     73
$ strace ./a1 2>&1 |wc -l
    103

在 a1 跟踪中,加载了两个额外的库,调用了更多的 mprotect,并添加了以下部分:

 set_tid_address; set_robust_list; rt_sigaction x 2; rt_sigprocmask; getrlimit; uname

最佳答案

glibc 本身包含许多 pthread 函数的 stub 代码。这些 glibc pthread 函数什么都不做。但是,当程序与 libpthread 链接时,这些 stub 将替换为真正的 pthread 锁定函数。

这适用于需要线程安全但本身不使用线程的库。这些库可以使用 pthread 锁,但这些锁实际上不会发生,直到加载链接到 libpthread 的程序或库。

关于linux - 链接 `-lpthread` 是否会改变应用程序行为? (Linux, Glibc),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6266183/

相关文章:

linux - 将所有输出重定向到 Bash 中的文件

使用线程计算两个数字的总和

C - 使用互斥锁同步多个线程

linux - 通过守护进程获取当前用户登录到 Linux

linux - 如何在使用 tar 提取文件时使用带通配符的 OR 运算符

c++ - 开发 C++ 应用程序以在嵌入式 Linux 设置上运行

linux - 何时检查 EINTR 并重复函数调用?

c - MPI 中的进程数有限制吗?

c - Linux 3.0 : "glibc detected" abort - tuning corruption detected feature?

linux - 正确分配堆栈以克隆线程