什么时候使用系统调用set_tid_address?

kri*_*itx 6 linux system-calls

我一直在尝试了解系统调用,并想了解 set_tid_address 的工作原理。从我读到的基本上来说,它返回所执行的程序或进程的pid。

我已经用 ls 对此进行了测试,但是对于某些命令(例如 uptime、top 等),我没有看到使用 set_tid_address 。这是为什么?

nin*_*alj 5

系统clone()调用可以采用一个CLONE_CHILD_CLEARTID标志,该标志child_tidptr(另一个clone()参数)的值将被清除,并且当子线程退出时,关联的 futex 会发出唤醒信号。这是用来实现的pthread_join()(父线程在futex上等待)。

set_tid_address()允许pthread_join()在初始线程上。更多信息请参见以下 LKML 线程:

[补丁] 线程修复,tid-2.5.47-A3
[补丁] user-vm-unlock-2.5.31-A2

至于为什么有些程序调用set_tid_address()而另一些程序不调用,答案很简单。(直接或间接)链接到 libpthread 调用的程序set_tid_addressls链接到librt, 链接到libpthread,因此它运行 NPTL 的初始化。