当前位置: 首页 > 面试题库 >

链接-lpthread会改变应用程序的行为吗?(Linux,Glibc)

廉展鹏
2023-03-14
问题内容

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

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调用了更多s,并添加了以下内容:

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

问题答案:

glibc本身包含许多pthread函数的存根代码。这些glibc
pthread函数不执行任何操作。但是,当程序与libpthread链接时,这些存根将被真正的pthread锁定功能取代。

这旨在用于需要线程安全但不使用线程本身的库中。这些库可以使用pthread锁,但是只有在加载了链接到libpthread的程序或库之后,这些锁才会真正发生。



 类似资料:
  • 所以...是真的需要还是我做错了什么? (当我提到应用程序链接不起作用时,我应该注意深度链接起作用,但Android仍然显示“默认应用程序选择对话框”) 更新1:我正在Android8.1上测试。我已经上传了文件。以下是我处理深层链接的活动:

  • 由于AndroidAnnotations,名称是“.mainActivity_”,而不是“mainActivity”。 除此之外,托管的AssetLinks.json可以通过HTTPS连接访问,下面是我的文件: SHA256指纹来自我用来构建应用程序发布版本的证书。

  • 如果<code>targetSdkVersion 我的应用程序< code>targetSdkVersion是27版本,我运行在< code>8.0.0[26]设备上。我得到了下面链接中描述的< code > IllegalStateException ,因为我使用了一个对话框< code>Activity。 只有全屏不透明的活动才能请求方向 有两个建议的选项。从中删除或将更改为26。这两个解决方

  • 问题内容: Android基于Linux;本机Linux应用程序可以在Android上运行吗? 问题答案: 一般来说,没有。Android应用程序通常在类似于Java的沙盒虚拟机中运行,因此必须使用Java或编译为使用Android API的虚拟机字节码的某种语言编写。 但是,虚拟机确实可以在基础Linux操作系统上运行,并且有多种方法可以调用本机代码。参见https://developer.an

  • 我在我的应用程序中启用了应用链接。它工作正常。但是在我的应用程序中,有一些情况下我无法处理传入的网址。在这种情况下,我想将该网址重定向到设备中的默认浏览器。 目前,我尝试使用intent打开带有url的浏览器,但它再次重定向到我的应用程序本身。应用程序链接的格式如下- 所以根据params,我想要么在应用程序本身中处理应用程序链接,要么将其重定向到默认浏览器。下面是我试图用上面的网址打开浏览器的代

  • 我有一个网站可以让用户进行搜索查询。查询可能需要一些时间来完成(几分钟到几天),我想让用户下载一个Android应用程序,并通过向用户发送一封带有链接的电子邮件来收到答案。 我希望无论用户是否安装了应用程序,这种机制都能起作用;换句话说: 如果用户拥有该应用程序,则应该使用包含标识符参数的深层链接打开该应用程序。 如果用户没有它,它应该在应用程序的页面上打开播放商店(例如