是否有使用 C++ 获取线程和/或进程标识符(字符串、int、...)的可移植方式?
8 回答
您有几种方法,但都意味着使用为您抽象线程的外部库。
在流行的选择中,有两个是:
- Boost.Thread库。这是最便携但暗示使用 Boost,这是一个巨大的库
- Qt库。这不太可移植,并且意味着可以与大型库 Qt 一起使用。
如果您已经在这两个库上使用过任何一个,我建议您坚持使用它。否则,请查看他们提供的其他工具并做出选择。
当可移植意味着一种适用于存在 C++ 编译器的每个平台的方法时,没有可移植的方法。这种方式必须是 C++ 标准的一部分,在这种情况下,它确实可以在任何地方工作(就像 C++ 标准的其他部分在任何地方都可以工作)。不保证标准中没有的所有内容都可以在任何平台上运行,除非平台声明支持该标准。
人们在这里建议的每个解决方案都是使用外部库的解决方案,因此只能在该库支持的平台上运行;并且没有可用于每个现有平台的库。
可能会让你走得最远的是 POSIX,毕竟每个类 UNIX 系统都试图支持至少一些 POSIX(越多越好),很少有人能称自己是真正 100% 兼容 POSIX 的平台(例如 A/UX, AIX、HP-UX、IRIX、Mac OS X 10.5、MINIX、QNX、Solaris、UnixWare、VxWorks……等等,当然还有更多)。然而,有相当多的平台至少提供一些 POSIX 支持,一些更多,一些更少,一些几乎是 POSIX 兼容的(例如 FreeBSD、Linux、NetBSD、BeOS、OpenBSD 等)。
不幸的是,Windows 还远未成为一体。NT 曾经部分符合 POSIX,但现在它或多或少地消失了(Win2000/20003、WinXP 和 Vista 仍然可以设置为 POSIX 模拟模式,通过安装 Microsoft Windows Services for UNIX 将一些 POSIX 调用转换为内部 API 调用- SFU 3.5 或更高版本),但是也可以通过外部库在 Windows 上获得一些 POSIX 功能(Cygwin 提供 LGPL 库,您可以将其与您的应用程序链接以在 Windows 上启用相当数量的 POSIX 功能)。
POSIX的优点不仅在于它比较普及,而且它是标准化的,你可以在网上很容易地查到这个标准。使用 POSIX 调用,您可以获得线程 ID 和进程 ID。
我一直认为线程是 C++ 的外部线程。在 Java 中,该语言内置了一个本地线程。
您必须找到一个可移植的线程库。
您还可以使用ACE 库的一部分,它实现了一个独立于平台的包装器。查找 PID 将是库中的文件之一(可能是 ACE_Process/ACE_Thread)。
getpid() 是一种获取进程 ID 的可移植方式。
我认为除非通过包装库,否则您不会找到可移植的方法。每个线程系统(例如 Windows 或 POSIX)都有自己的机制。