5

是否有使用 C++ 获取线程和/或进程标识符(字符串、int、...)的可移植方式?

4

8 回答 8

9

您有几种方法,但都意味着使用为您抽象线程的外部库。

在流行的选择中,有两个是:

  1. Boost.Thread库。这是最便携但暗示使用 Boost,这是一个巨大的库
  2. Qt库。这不太可移植,并且意味着可以与大型库 Qt 一起使用。

如果您已经在这两个库上使用过任何一个,我建议您坚持使用它。否则,请查看他们提供的其他工具并做出选择。

于 2008-10-06T16:46:42.350 回答
7

当可移植意味着一种适用于存在 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。

于 2008-10-06T17:36:06.323 回答
1

我一直认为线程是 C++ 的外部线程。在 Java 中,该语言内置了一个本地线程。

您必须找到一个可移植的线程库。

于 2008-10-06T16:47:16.140 回答
1

唯一的方法是使用可移植库。我推荐Qt(它不必是 GUI 应用程序)或者wxWidgets。如果您正在开发游戏,请查看SDL

还可以查看 boost libs,他们可能有一些东西。

于 2008-10-06T17:04:24.577 回答
1

您还可以使用ACE 库的一部分,它实现了一个独立于平台的包装器。查找 PID 将是库中的文件之一(可能是 ACE_Process/ACE_Thread)。

于 2008-10-08T11:16:03.657 回答
0

我不确定它们的便携性,但Posix 线程可能是您要考虑的另一种选择。另请参见此处。我同意史蒂夫的评论——可移植到哪些平台?

于 2008-10-06T16:56:01.537 回答
0

getpid() 是一种获取进程 ID 的可移植方式。

于 2008-10-06T19:18:52.263 回答
0

我认为除非通过包装库,否则您不会找到可移植的方法。每个线程系统(例如 Windows 或 POSIX)都有自己的机制。

于 2011-01-13T14:23:43.683 回答