我一直在尝试理解系统调用,并希望了解set_tid_address是如何工作的。基本上,从我所读到的是,它返回的程序或进程的pid是执行的。我已经用ls测试过了,但是对于一些命令,比如uptime,top等,我没有看到set_tid_address被使用。为什么呢?
nx7onnlm1#
clone()系统调用可以接受一个CLONE_CHILD_CLEARTID标志,child_tidptr(另一个clone()参数)的值被清除,并且当子线程退出时,相关的futex发出唤醒信号。这用于实现pthread_join()(父线程等待futex)。set_tid_address()允许在初始线程上使用pthread_join()。有关详细信息,请参阅以下LKML线程:[patch] threading fix, tid-2.5.47-A3[patch] user-vm-unlock-2.5.31-A2至于为什么有些程序调用set_tid_address()而有些程序不调用,答案很简单,链接到libpthread的程序调用set_tid_address(直接或间接),ls链接到librt,librt链接到libpthread,所以它运行NPTL的初始化。
clone()
CLONE_CHILD_CLEARTID
child_tidptr
pthread_join()
set_tid_address()
set_tid_address
ls
librt
libpthread
jtw3ybtb2#
根据Linux Programmer's Manual,set_tid_address用于:设置指向线程ID的指针当它完成时,它返回调用进程的PID。不幸的是,手册对您何时真正想要使用这个系统调用含糊其辞。无论如何,您认为这些命令为什么使用set_tid_address?
2条答案
按热度按时间nx7onnlm1#
clone()
系统调用可以接受一个CLONE_CHILD_CLEARTID
标志,child_tidptr
(另一个clone()
参数)的值被清除,并且当子线程退出时,相关的futex发出唤醒信号。这用于实现pthread_join()
(父线程等待futex)。set_tid_address()
允许在初始线程上使用pthread_join()
。有关详细信息,请参阅以下LKML线程:[patch] threading fix, tid-2.5.47-A3
[patch] user-vm-unlock-2.5.31-A2
至于为什么有些程序调用
set_tid_address()
而有些程序不调用,答案很简单,链接到libpthread的程序调用set_tid_address
(直接或间接),ls
链接到librt
,librt
链接到libpthread
,所以它运行NPTL的初始化。jtw3ybtb2#
根据Linux Programmer's Manual,set_tid_address用于:
设置指向线程ID的指针
当它完成时,它返回调用进程的PID。不幸的是,手册对您何时真正想要使用这个系统调用含糊其辞。
无论如何,您认为这些命令为什么使用
set_tid_address
?