解决不同进程下,线程id相同情况无法通信的问题

    1. linux下每一个进程都一个进程id,类型`pid_t`,可以由 `getpid()`获取。<br /> POSIX线程也有线程id,类型`pthread_t`,可以由 `pthread_self()`获取,线程id由线程库维护。<br /> 但是各个进程独立,所以会有不同进程中线程号相同节的情况。

    那么这样就会存在一个问题,我的进程p1中的线程pt1要与进程p2中的线程pt2通信怎么办?

    进程id不可以,线程id又可能重复,所以这里会有一个真实的线程id唯一标识,tid。glibc没有实现gettid的函数,所以我们可以通过linux下的系统调用syscall(SYS_gettid)来获得。
    测试代码如下:

    1. #include <stdio.h>
    2. #include <pthread.h>
    3. #include <sys/types.h>
    4. #include <sys/syscall.h>
    5. #include <unistd.h>
    6. void *hello(void *s){
    7. printf("%s()\t, line = %d\t, getpid() = %#x\n",__FUNCTION__,__LINE__,getpid());
    8. printf("%s()\t, line = %d\t, pthread_self() = %#x\t, SYS_gettid = %#x\n",__FUNCTION__,__LINE__,pthread_self(),syscall(SYS_gettid));
    9. }
    10. int main(){
    11. printf("%s()\t, line = %d\t, getpid() = %#x\n",__FUNCTION__,__LINE__,getpid());
    12. printf("%s()\t, line = %d\t, pthread_self() = %#x\t, SYS_gettid = %#x\n",__FUNCTION__,__LINE__,pthread_self(),syscall(SYS_gettid));
    13. pthread_t thread_id;
    14. pthread_create(&thread_id,NULL,hello,NULL);
    15. pthread_join(thread_id,NULL);
    16. return 0;
    17. }

    image.png
    结论:

    • **getpid()**得到的是进程的**pid**,在内核中,每个线程都有自己的**PID**,要得到线程的**PID**(即TID),必须用**syscall(SYS_gettid);**
    • **pthread_self()**获取的是线程ID,仅在同一个进程中保证唯一
    • 注意到:在**main**函数中,**getpid**的值与**syscall(SYS_gettid)**的值相同,而在**pthread_self()**则不同,也验证了上述观点