pthread_self()
ubuntu 12.04
费用是否pthread_self()
?
它是否使用系统调用?
我想在每次线程写入日志时调用{{1}},因此我将知道哪个线程写入日志并在日志中提及它。所有线程都写入同一个日志文件。
答案 0 :(得分:5)
您可以在此处查看源代码:https://fossies.org/dox/glibc-2.19/pthread__self_8c_source.html
从上面的链接可以看出,pthread_self()返回THREAD_SELF,它被定义为一个简单的程序集movl
指令。没有系统调用那里。当然,这是实现定义的。上面的链接指的是glibc库。
答案 1 :(得分:4)
正如dvnrrs所说,我写了以下code
:
#include <pthread.h>
int main(void) {
int i;
for (i = 0; i < 100000; i++) {
pthread_self();
}
}
并使用time code
得到了:
真实0m0.001s
用户0m0.000s
sys 0m0.001s
运行循环10000000次给了我:
真实0m0.045s
用户0m0.044s
sys 0m0.000s
我用strace -c -ttT ./code
运行了
%time seconds usecs / call calls errors syscall
-nan 0.000000 0 2读取
-nan 0.000000 0 3打开
-nan 0.000000 0 3 close
-nan 0.000000 0 3 fstat
-nan 0.000000 0 11 mmap
-nan 0.000000 0 5 mprotect
-nan 0.000000 0 1 munmap
-nan 0.000000 0 1 brk
-nan 0.000000 0 2 rt_sigaction
-nan 0.000000 0 1 rt_sigprocmask
-nan 0.000000 0 1 1访问
-nan 0.000000 0 1 execve
-nan 0.000000 0 1 getrlimit
-nan 0.000000 0 1 arch_prctl
-nan 0.000000 0 2 1 futex
-nan 0.000000 0 1 set_tid_address
-nan 0.000000 0 1 set_robust_list
100.00 0.000000 40 2总计
答案 2 :(得分:0)
即使pthread_self()
导致系统调用,它也会相对便宜,因为它只会查找结果。它肯定不会抓住任何锁(因为你需要的值是不变的),或者做任何其他的巨大性能燃烧器。我希望低于1微秒的东西,但我可能错了。
如果您在write()
来电后立即拨打电话,则无需担心pthread_self()
的效果,因为write()
所需的时间会更长。毕竟,write()
确实需要获取锁以确保POSIX语义(即,写入的数据立即对所有其他进程可见)。
如果您的实验显示pthread_self()
确实执行了系统调用,则可以轻松地将其返回值缓存在您在pthread开头设置的thread_local
全局变量中{{1如果我没有弄错的话,}}关键字是C / C ++ 11标准的一部分。