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