线程的线程号在 pthread 当中的一个线程对应一个内核的线程 , 内核和 pthread 都给线程维护了一个线程的 id 号 , 我们可以使用 gettid 获取操作系统给我们维护的线程号 , 使用函数 pthread_self 得到 pthread 线程库给我们维护的线程号!
#define _GNU_SOURCE#include <stdio.h>#include <unistd.h>#include <pthread.h>#include <sys/types.h>void* func(void* arg) { printf("pthread id = %ld tid = %d\n", pthread_self(), (int)gettid()); return NULL;}int main() { pthread_t t; pthread_create(&t, NULL, func, NULL); pthread_join(t, NULL); return 0;}【二 Pthread 并发编程】上面的程序的输出结果如下:
pthread id = 140063790135040 tid = 161643线程与信号在 pthread 库当中主要给我们提供了一些函数用于信号处理 , 我们在 pthread 库当中可以通过函数 pthread_kill 给其他的进程发送信号 。
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR111) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+338) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+843) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+1348) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-1253) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-758) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-263) SIGRTMAX-1 64) SIGRTMAX我们可以在一个线程当中响应其他线程发送过来的信号 , 并且响应信号处理函数 , 在使用具体的例子深入了解线程的信号机制之前 , 首先我们需要了解到的是在 pthread 多线程的程序当中所有线程是共享信号处理函数的 , 如果在一个线程当中修改了信号处理函数 , 这个结果是会影响其他线程的 。
#define _GNU_SOURCE#include <stdio.h>#include <pthread.h>#include <unistd.h>#include <signal.h>#include <string.h>void sig(int signo) { char s[1024]; sprintf(s, "signo = %d tid = %d pthread tid = %ld\n", signo, gettid(), pthread_self()); write(STDOUT_FILENO, s, strlen(s));}void* func(void* arg) { printf("pthread tid = %ld\n", pthread_self()); for(;;); return NULL;}int main() { signal(SIGHUP, sig); signal(SIGTERM, sig); signal(SIGSEGV, sig); pthread_t t; pthread_create(&t, NULL, func, NULL); sleep(1); pthread_kill(t, SIGHUP); sleep(1); return 0;}上面的程序的输出结果如下所示:
pthread tid = 140571386894080signo = 1 tid = 7785 pthread tid = 140571386894080在上面的程序当中 , 我们首先在主函数里面重新定义了几个信号的处理函数 , 将 SIGHUP、SIGTERM 和 SIGSEGV 信号的处理函数全部声明为函数 sig , 进程当中的线程接受到这个信号的时候就会调用对应的处理函数 , 在上面的程序当中主线程会给线程 t 发送一个 SIGHUP 信号 , 根据前面信号和数据对应关系我们可以知道 SIGHUP 对应的信号的数字等于 1 , 我们在信号处理函数当中确实得到了这个信号 。
经验总结扩展阅读
- 十二星座是怎样解读爱情的
- 如何理解Java中眼花缭乱的各种并发锁?
- 十二星座中不适合异地恋的星座
- 2023年农历二月二十九出生的男孩命运和五行分析
- 2023年阴历五月初二日是封顶的好日子吗
- 2023年7月29日农历六月十二是乔迁最佳日期吗 2023年7月29日适不适合乔迁
- 2023年农历九月二十六能不能搬家入伙 农历二零二三年九月廿六能不能搬家
- 2023年农历九月二十七吉利吗 今天宜搬入新家吗
- 2023年农历九月二十八可以搬家吗 2023年农历九月二十八搬家怎么样
- 二宁是哪两个省