我的理解是,有些(如果不是全部)系統呼叫可能會被阻塞。這是阻塞呼叫嗎?我想在一個被重復呼叫并且對時間敏感的函式中獲得一個唯一的執行緒 id。我打算這樣做:
//header.h
#define _GNU_SOURCE
#include <sys/syscall.h>
#ifdef SYS_gettid
#define gettid() syscall(SYS_gettid)
#else
#define gettid() 0
#endif
//file.c
#include "header.h"
...
void function()
{
pid_t thread = gettid();
//Logic based on thread
...
}
這里的函式會被重復呼叫并且不能阻塞。也許我應該使用pthread_self()和pthread_equal(t1, t2)?謝謝。
編輯:我同樣可以很好地使用。我知道它們不提供相同的回傳值,但我將在執行緒 id 上執行的邏輯是將它與一組已知的執行緒 id 進行比較,以基本上確定誰在呼叫它。我保存了 gettid() 回傳值和 pthread_self() 回傳值。
uj5u.com熱心網友回復:
您應該使用pthread_self,主要是因為它是可移植的而syscall(SYS_gettid)不是可移植的,還因為典型的實作根本不需要陷入內核。例如,在我正在輸入的機器上,有一個特殊的硬體暫存器,稱為tpidr_el0存盤指向執行緒特定資料的指標,因此pthread_self可以只有三個指令,無需更改權限級別:
0000000000077870 <pthread_self>:
77870: d53bd040 mrs x0, tpidr_el0
77874: d11e4000 sub x0, x0, #0x790
77878: d65f03c0 ret
公平地說,對這種架構的系統呼叫也只是少數指令,例如
00000000000a67c0 <getpid>:
a67c0: d503245f bti c
a67c4: d2801588 mov x8, #0xac
a67c8: d4000001 svc #0x0
a67cc: d65f03c0 ret
但是 syscall 存根的匯編轉儲并沒有顯示隱藏在該svc指令背后的數百甚至數千個周期的成本。如果您正在做一些頻繁且對時間敏感的事情,那么不陷入內核可能是一個巨大的勝利。
我還建議你考慮重新組織你的代碼,這樣作業就會分批進行,而且你不需要問“我在哪個執行緒上?” 很經常。根本沒有完成的操作總是最快的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/398348.html
