有什麼辦法從Linux的信號處理程序中獲取當前線程ID? getpid()
方法做我想要的,但不清楚它是否是異步安全的。 man 7 signal
提供了一個異步安全的POSIX方法列表,但是這不會告訴我們有關非POSIX方法(如getpid()
)的任何內容。據推測,Linux添加的許多非POSIX方法中有一些是異步安全的,但我找不到列表。是否有一種異步安全的方式在Linux中獲取當前線程ID?
還有this answer它聲稱所有直接(不復用)系統調用是異步安全的,但沒有提供證據。
目標是建立某種異步安全的線程本地存儲,因爲__thread
is not safe在一般情況下。
它不一定是「Linux線程ID」 - 任何一致的線程ID都可以。例如pthread_self
會很好,但沒有任何聲稱是異步安全的。如果我們檢查的glibc的Linux該方法的實現,它推遲到THREAD_SELF宏,它看起來像:
# define THREAD_SELF \
({ struct pthread *__self; \
asm ("movl %%gs:%c1,%0" : "=r" (__self) \
: "i" (offsetof (struct pthread, header.self))); \
__self;})
它似乎是,這應該是異步安全的,如果有問題的線程根據一個制度來填充resgister(也許Linux中的所有線程都是,我不確定)。不過看着that header讓我有點害怕......
您不會使用'pthread_self'作爲線程ID嗎? –
這也可以,但沒有跡象表明這種方法是異步安全的,pthreads方法在一般情況下是異步安全的(當然,互斥方法不是)。 也許我可以使用'pthread_self'的平臺特定實現來破解我知道的線程安全方法的顯式版本? – BeeOnRope
內聯asm片段肯定是異步安全的。如果在執行時收到另一個信號,會發生什麼樣的惡行?沒有。 (注意'getpid'實際上並不是系統調用的方式 - glibc只在第一次嘗試時執行「系統調用」,並在此後緩存該值,而實際中的「系統調用」會進入vDSO)。 – Damon