2014-03-03 135 views
1

pthread_self()ubuntu 12.04貴嗎?
它使用系統調用嗎?pthread_self()是否昂貴?

每次線程寫入日誌時,我都想調用pthread_self(),所以我會知道哪個線程寫入日誌並在日誌中提及它。所有線程都寫入相同的日誌文件。

+5

嘗試它並找出答案。編寫一個測試程序來調用它,例如100,000次並測量其性能應該很容易。我估計它相當便宜,但我不確定。你可以使用['strace'](http://linux.die.net/man/1/strace)來找出它的系統調用,如果有的話。對於獎勵積分,回到這裏,回答你對自己的問題的回答,並發現你的問題......我會加倍努力。 :) – TypeIA

+2

瑙,它的O(1),這意味着系統調用,而且很便宜...複製從每個線程有一個被稱爲偏移,與寄存器應始終保持段的具體結構線程ID。請參閱http://www.unix.com/programming/137683-calling-pthread_self-ubuntu-expensive.html –

回答

3

由於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總

1

即使pthread_self()導致系統調用,它將是一個相對便宜的,因爲它只是查找結果。它絕對不會鎖住任何鎖(因爲你需要的值是不變的),或者做任何其他巨大的性能燒錄器。我期望在1微秒以下,但我可能是錯的。

如果您在撥打write()後立即致電,則不需要擔心pthread_self()的性能,因爲write()所需的時間會更長。畢竟,write()確實需要獲取鎖以確保POSIX語義(即寫入的數據對所有其他進程立即可見)變得可見。

如果你的實驗表明您pthread_self()確實執行系統調用,您可以輕鬆地在你的並行線程開始時設置權thread_local全局變量緩存它的返回值(thread_local關鍵字中的C/C + +11標準,如果我沒有太大錯誤)。