【发布时间】:2010-09-15 13:30:18
【问题描述】:
是否有一种可移植的方法来使用 C++ 获取线程和/或进程标识符(字符串、整数、...)?
【问题讨论】:
-
可移植于哪些平台/架构?
标签: c++ multithreading process
是否有一种可移植的方法来使用 C++ 获取线程和/或进程标识符(字符串、整数、...)?
【问题讨论】:
标签: c++ multithreading process
您有几种方法,但都意味着使用外部库为您抽象线程。
在流行的选择中,有两个:
如果您已经在这两个库上使用过任何一个,我建议您继续使用它。否则,请查看他们提供的其他工具并做出选择。
【讨论】:
当可移植意味着在存在 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 的优点不仅在于它比较普及,而且它是标准化的,你可以很容易地在 Internet 上查找该标准。使用 POSIX 调用,您可以获得线程 ID 和进程 ID。
【讨论】:
我一直认为线程是 C++ 外部的。在 Java 中,该语言内置了一个本地线程。
你必须找到一个可移植的线程库。
【讨论】:
您也可以使用ACE library 的一部分,它实现了一个独立于平台的包装器。查找 PID 将是库中的文件之一(可能是 ACE_Process/ACE_Thread)。
【讨论】:
我不确定它们的便携性,但Posix threads 可能是您想要考虑的另一个选择。另见here。我同意史蒂夫的评论——可移植到哪些平台?
【讨论】:
getpid() 是一种获取进程 ID 的可移植方式。
【讨论】:
我认为除非通过包装库,否则您不会找到可移植的方法。每个线程系统(例如 Windows 或 POSIX)都有自己的机制。
【讨论】: