首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >链接一个`-lpthread`会改变应用程序的行为吗?(Linux、Glibc)

问链接一个`-lpthread`会改变应用程序的行为吗?(Linux、Glibc)
EN

Stack Overflow用户
提问于 2011-06-07 21:47:05
回答 1查看 2K关注 0票数 11

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

1)链接照常,不带-lpthread和-ldl

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

例如。

代码语言:javascript
复制
$ cat a.c
int main(){printf("Hehe");}
$ gcc a.c -w -o a
$ gcc a.c -w -o a1 -ldl -lpthread

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

代码语言:javascript
复制
$ 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中,什么会以不同的方式工作?pthreads的链接会不会改变内部从线程不安全到线程安全的算法?

例如。

代码语言:javascript
复制
$ strace ./a 2>&1 |wc -l
     73
$ strace ./a1 2>&1 |wc -l
    103

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

代码语言:javascript
复制
 set_tid_address; set_robust_list; rt_sigaction x 2; rt_sigprocmask; getrlimit; uname
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-06-07 21:59:02

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

这是为了在需要线程安全但不使用线程本身的库中使用。这些库可以使用pthread锁,但在加载链接到libpthread的程序或库之前,这些锁实际上不会发生。

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6266183

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档