pthread_self()贵吗?

时间:2014-03-03 21:15:48

标签: c++ c multithreading performance ubuntu-12.04

pthread_self() ubuntu 12.04费用是否pthread_self()? 它是否使用系统调用?

我想在每次线程写入日志时调用{{1}},因此我将知道哪个线程写入日志并在日志中提及它。所有线程都写入同一个日志文件。

3 个答案:

答案 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标准的一部分。