标题:pthread的一点杂碎 出处:Felix021 时间:Thu, 25 Apr 2013 17:16:09 +0000 作者:felix021 地址:https://www.felix021.com/blog/read.php?2118 内容: 1. 虽然都用 -lpthread 来链接到 libpthread.so ,但是实际上 pthread 是POSIX规范规定的接口,不是某一个库的名字。不同的类Unix系统在底层对pthread的实现不一样。 2. 在Linux的实现里,每个pthread线程都对应一个LWP(light weight process);而LWP是由内核线程支持的,由内核统一调度,所以每个pthread线程都有对应task_struct,以及对应的tid(不是pthread_self()返回的那货,而是类似于pid),所以效率就不会太高(因为切换什么的都要回到内核里,而syscall的效率……),而且对应地,还要消耗内核线程的栈空间等资源,所以效率不会很高。 3. man gettid可以看到这个syscall是在 sys/types.h 里,但是实际上在我的ubuntu 12.04, kernel 3.2.0上面没有,需要这样: #include #define gettid() syscall(__NR_gettid) 不加上的话,结果就是 error: ‘gettid’ was not declared in this scope 4. 每个线程都有单独的cpu_affinity,通过 pthread_setaffinity_np, pthread_getaffinity_np 来读写。 5. Linux下,在 /proc/[PID]/task 下面包含了进程的所有线程的相关信息,每个线程一个目录,目录名就是线程的ID;每个线程的相关信息与进程类似,: 引用 felix021@xxx:/proc/8660$ ls task/ 8660 8662 8663 8664 felix021@xxx:/proc/8660:/proc/8660$ ls task/8662 attr cmdline cwd exe fdinfo limits maps mounts oom_score schedstat stat status auxv cpuset environ fd io loginuid mem oom_adj root smaps statm wchan 5. 每个线程可以被调度到不同CPU上面,类似于进程的/proc/PID/stat文件,线程当前运行的CPU ID保存在对应目录内的stat文件中第39个字段: 引用 felix021@xxx/proc/8660$ for i in /proc/8660/task/*; do LWP=`basename $i`; PSR=`awk '{print $39}' $i/stat`; echo $LWP, $PSR; done 8660, 1 8662, 1 8663, 15 8664, 14 6. 可以用ps的 L 和 F 参数列出所有的LWP: 引用 felix021@xxx:~/code$ ps -FL UID PID PPID LWP C NLWP SZ RSS PSR STIME TTY TIME CMD fengmin 7792 7791 7792 0 1 16561 1676 0 16:02 pts/3 00:00:00 -bash fengmin 8660 7792 8660 0 4 11111 1004 1 17:04 pts/3 00:00:00 ./ttt fengmin 8660 7792 8662 99 4 11111 1004 1 17:04 pts/3 00:05:05 ./ttt fengmin 8660 7792 8663 99 4 11111 1004 15 17:04 pts/3 00:05:05 ./ttt fengmin 8660 7792 8664 99 4 11111 1004 14 17:04 pts/3 00:05:05 ./ttt fengmin 8692 7792 8692 0 1 16411 996 2 17:09 pts/3 00:00:00 ps -FL 其中LWP列就是LWP的id,PSR是processor,也就是CPU ID。 p.s. 另外有个GNU PTH,这个是 n:1 的,纯用户空间完成调度的线程库,POSIX兼容。 Generated by Bo-blog 2.1.0