Linux下获得线程ID syscall(224)
生活随笔
收集整理的這篇文章主要介紹了
Linux下获得线程ID syscall(224)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
From: http://blog.163.com/onx0320@126/blog/static/164736436201252574720314/
??? 早在Linux kernel2.4之前,Linux的線程(LinuxThread)屬于用戶級,內(nèi)核根本不知道線程的存在,為了得到內(nèi)核的支持,2003 年,Redhat公司(很了不起的一個公司)發(fā)布了NPTL(Native POSIX Thread Library),至今廣泛使用。
??? NPTL很優(yōu)秀,對信號的處理是按照每進程的原則進行的;getpid() 會為所有的線程返回相同的進程 ID。例如,如果發(fā)送了 SIGSTOP 信號,那么整個進程都會停止;使用 LinuxThreads,只有接收到這個信號的線程才會停止。這樣可以在基于 NPTL 的應用程序上更好地利用調(diào)試器,例如 GDB。
??? 額外話說多了,下面具體看看下面如何獲得線程的ID吧!
???
??? 經(jīng)常我們需要在程序一個線程中獲得這個線程的id,有人會說,可以通過pthread_create函數(shù)傳遞參數(shù)傳入,等主線程創(chuàng)建子線程成功,那么這個pid會自動賦值
#define TNUM 2
struct BN
{
??? pthread_t pid;
??? int N;
};
void *run(void *args)
{
??? BN *recive = (BN *)args;
??? cout << "pid: " << recive->pid << endl;
??? return (void *)(recive->N);
}
int main(int c, char *v[])
{
??? int i;
??? int ret;
??? char *result;
??? pthread_t pid[TNUM];
??? BN bn[TNUM];
??? for (i = 0; i < TNUM; i ++)
??? ?{
??? ??? bn[i].pid = pid[i];
??? ??? bn[i].N = mN;
??? ??? ret = pthread_create(&pid[i], NULL, run, &bn[i]);
??? //...出錯處理
??? }
??? return 0;
}
?? 難題是主線程去分配子線程id的時刻,run函數(shù)并不能很確切的知道,所以當讀取recive->pid時,就會產(chǎn)生錯誤;
??? 正確的方法應該使用pthread_self()函數(shù)來獲得POSIX的線程id,此函數(shù)調(diào)用內(nèi)部進制直到pid分配完成。
??? 有人會問,獲取進程id的函數(shù)不是getpid(),獲取線程id的函數(shù)不是gettid()么?
這里與剛才前面所說的有些關系,目前gettid獲得的pid是需要系統(tǒng)調(diào)用(syscall)的,這個syscall返回的pid不是上面所說的POSIX線程id,這個是內(nèi)核的線程id,具體調(diào)用的方式如下:
pid_t pid = syscall(SYS_gettid);
或
pid_t pid = syscall(__NR_gettid);
或
//僅限于i386,如果是x86_64,則調(diào)用186
pid_t pid = syscall(224);
以往舊的方式syscallx的調(diào)用已經(jīng)被廢棄。
??? 看到這里,也許有人會問,pid_t和pthread_t可以相互轉(zhuǎn)換么?一個是POSIX的線程、一個是內(nèi)核的線程?如果你感興趣在這方面研究的話,可以不妨試試,答案肯定是可以的。
??? 至此,你看完這篇文章,明白了linux線程id怎么獲得了么?
總結(jié)
以上是生活随笔為你收集整理的Linux下获得线程ID syscall(224)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: leetcode53 Maximum S
- 下一篇: linux 下清空回收站命令