【问题标题】:Is pthread_self() expensive?pthread_self() 贵吗?
【发布时间】:2014-03-03 21:15:48
【问题描述】:
pthread_self() 比 ubuntu 12.04 贵吗?
它使用系统调用吗?
我想在每次线程写入日志时调用pthread_self(),这样我就会知道哪个线程写入日志并在日志中提及。所有线程都写入同一个日志文件。
【问题讨论】:
-
试试看吧。编写一个测试程序来调用它,比如 100,000 次并测量它的性能应该很容易。我猜它相当便宜,但我不确定。您可以使用strace 找出它产生的系统调用(如果有)。对于奖励积分,请回到这里并用您发现的内容发布您自己的问题的答案......我会支持它。 :)
-
不,它是 O(1),没有系统调用,而且非常便宜...从每个线程具有的特定结构中复制线程 id 作为已知偏移量,并使用一个应该始终保存的寄存器段。见unix.com/programming/…
标签:
c++
c
multithreading
performance
ubuntu-12.04
【解决方案2】:
按照 dvnrrs 的建议,我写了以下code:
#include <pthread.h>
int main(void) {
int i;
for (i = 0; i < 100000; i++) {
pthread_self();
}
}
并使用time code 运行它
得到:
真正的 0m0.001s
用户 0m0.000s
系统 0m0.001s
运行循环 10000000 次给了我:
真正的 0m0.045s
用户 0m0.044s
系统 0m0.000s
我用strace -c -ttT ./code 运行它并得到了
% time seconds usecs/call 调用错误 syscall
-nan 0.000000 0 2 读取
-nan 0.000000 0 3 打开
-nan 0.000000 0 3 关闭
-nan 0.000000 0 3 fstat
-nan 0.000000 0 11 映射
-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 执行
-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 总计
【解决方案3】:
即使pthread_self() 导致系统调用,它也将是一个相对便宜的系统调用,因为它只是查找结果。它绝对不会抓住任何锁(因为您需要的值是恒定的),或者做任何其他会消耗大量性能的事情。我预计会低于 1 微秒,但我可能错了。
如果在write() 调用之后立即调用它,则不必担心pthread_self() 的性能,因为write() 所需的时间会更长。毕竟,write() 确实需要获取锁以确保 POSIX 语义(即写入的数据立即对所有其他进程可见)。
如果您的实验表明 pthread_self() 确实执行了系统调用,您可以轻松地将其返回值缓存在您在 pthread 开始时设置的 thread_local 全局变量中(thread_local 关键字是如果我没记错的话,请参考 C/C++11 标准)。