pthread_self()
ubuntu 12.04
貴嗎?
它使用系統調用嗎?pthread_self()是否昂貴?
每次線程寫入日誌時,我都想調用pthread_self()
,所以我會知道哪個線程寫入日誌並在日誌中提及它。所有線程都寫入相同的日誌文件。
pthread_self()
ubuntu 12.04
貴嗎?
它使用系統調用嗎?pthread_self()是否昂貴?
每次線程寫入日誌時,我都想調用pthread_self()
,所以我會知道哪個線程寫入日誌並在日誌中提及它。所有線程都寫入相同的日誌文件。
由於dvnrrs建議,我寫了下面code
:
#include <pthread.h>
int main(void) {
int i;
for (i = 0; i < 100000; i++) {
pthread_self();
}
}
而且隨着time code
跑了,並得到:
真正0m0.001s
用戶0m0.000s
sys 0m0.001s
運行千萬次循環遞給我:
真正0m0.045s
用戶0m0.044s
SYS 0m0.000s
我strace -c -ttT ./code
跑了,並得到
%秒秒usecs/call calls errors系統調用
-NAN 0.000000 0 2讀
-NAN 0.000000 0 3打開
-NAN 0。000000 0 3靠近
-in 0.000000 0.000000 0 0 3 FSTAT
-in 11 MMAP
-in 0.000000 0.000000 0 0 5的mprotect
-in 1 munmap
-in 0.000000 0.000000 0 0 1 BRK
-in 2 rt_sigaction
-in 0 1 0.000000 0.000000 0 1 1 rt_sigprocmask
-in訪問
-in 0 1 0.000000 0.000000 0 1 execve的
-in getrlimit
-in 0.000000 0.000000 0 0 1 arch_prctl
-in 2 1 futex的
-in 0.000000 0.000000 0 0 1 set_tid_address
-in 1 set_robust_list
100.00 0.000000 40 2總
即使pthread_self()
導致系統調用,它將是一個相對便宜的,因爲它只是查找結果。它絕對不會鎖住任何鎖(因爲你需要的值是不變的),或者做任何其他巨大的性能燒錄器。我期望在1微秒以下,但我可能是錯的。
如果您在撥打write()
後立即致電,則不需要擔心pthread_self()
的性能,因爲write()
所需的時間會更長。畢竟,write()
確實需要獲取鎖以確保POSIX語義(即寫入的數據對所有其他進程立即可見)變得可見。
如果你的實驗表明您pthread_self()
確實執行系統調用,您可以輕鬆地在你的並行線程開始時設置權thread_local
全局變量緩存它的返回值(thread_local
關鍵字中的C/C + +11標準,如果我沒有太大錯誤)。
您可以查看源代碼在這裏:https://fossies.org/dox/glibc-2.19/pthread__self_8c_source.html
正如你可以從上面的鏈接看到,pthread_self()返回THREAD_SELF,它被定義爲一個簡單的裝配movl
指令。那裏沒有系統調用。當然,這是實現定義的。上面的鏈接是指glibc庫。
嘗試它並找出答案。編寫一個測試程序來調用它,例如100,000次並測量其性能應該很容易。我估計它相當便宜,但我不確定。你可以使用['strace'](http://linux.die.net/man/1/strace)來找出它的系統調用,如果有的話。對於獎勵積分,回到這裏,回答你對自己的問題的回答,並發現你的問題......我會加倍努力。 :) – TypeIA
瑙,它的O(1),這意味着系統調用,而且很便宜...複製從每個線程有一個被稱爲偏移,與寄存器應始終保持段的具體結構線程ID。請參閱http://www.unix.com/programming/137683-calling-pthread_self-ubuntu-expensive.html –