如何在C / C ++中将BSD上的线程ID作为整数?

时间:2010-10-23 13:21:57

标签: c multithreading bsd

有没有人知道在BSD上将当前线程ID作为整数?

我发现了这个

#ifdef RTHREADS
  299     STD     { pid_t sys_getthrid(void); }
  300     STD     { int sys_thrsleep(void *ident, int timeout, void *lock); }
  301     STD     { int sys_thrwakeup(void *ident, int n); }
  302     STD     { int sys_threxit(int rval); }
  303     STD     { int sys_thrsigdivert(sigset_t sigmask); }
#else
  299     UNIMPL
  300     UNIMPL
  301     UNIMPL
  302     UNIMPL
  303     UNIMPL
#endif

并尝试(长)系统调用(229)但不起作用(它崩溃)。在Linux上,我可以通过系统调用(长)系统调用(224)获得线程ID,它给出一个整数(通常是4位数)。有人可以帮忙吗?!谢谢。

2 个答案:

答案 0 :(得分:4)

没有“BSD”这样的东西。每个* BSD系统都完全不同,特别是涉及到线程时。即使在像FreeBSD这样的单个项目中,也有各种pthread实现(libc_r,kse,thr),它们在os版本和用户配置之间有所不同。

话虽如此,在FreeBSD-8上/usr/include/sys/thr.h应该有int thr_self(long *id),而在/usr/include/lwp.h {{}}} {{}}} {{}}} {} {}

对于更多平台,您可以查看葡萄酒来源中的int get_unix_tid(void)

答案 1 :(得分:0)

找出< sys / types.h>可以包含在您的C翻译单元中(通过检查oyur包括路径)。 pid_t在那里定义。它是一个有符号整数类型,但其中有一些。它可能比很长很宽。

The Open Groups documentation sys / types.h承诺“实现应支持一个或多个编程环境,其中blksize_t,pid_t,size_t,ssize_t,suseconds_t和useconds_t的宽度不大于类型的宽度可以使用confstr()函数或getconf实用程序获取这些编程环境的名称。“所以你可以将pid_t强制转换为long(或至少使用getconf来找出你需要做什么才能在pid_t可以安全地转换为long的情况下)。

请参阅C Language Gotchas: printf format strings,了解为什么您要做的事情很复杂,无法编写,并且可能会在未来突然中断。