【问题标题】:C++ thread/process identifierC++ 线程/进程标识符
【发布时间】:2010-09-15 13:30:18
【问题描述】:

是否有一种可移植的方法来使用 C++ 获取线程和/或进程标识符(字符串、整数、...)?

【问题讨论】:

  • 可移植于哪些平台/架构?

标签: c++ multithreading process


【解决方案1】:

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

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

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

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

【讨论】:

  • Boost 非常大,但请记住,您只需为使用的内容付费。
【解决方案2】:

当可移植意味着在存在 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。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      还可以查看 boost 库,它们可能有一些东西。

      【讨论】:

        【解决方案5】:

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

        【讨论】:

        • 如果您的目的是以可移植的方式获取平台进程 ID,那么 ACE 是适用于许多平台的经过验证的解决方案。然而,并非每个平台都可以提供相同的信息。在那种情况下,你不会得到你想要的。
        【解决方案6】:

        我不确定它们的便携性,但Posix threads 可能是您想要考虑的另一个选择。另见here。我同意史蒂夫的评论——可移植到哪些平台?

        【讨论】:

          【解决方案7】:

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

          【讨论】:

            【解决方案8】:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2018-09-22
              • 2015-07-17
              • 2010-09-20
              • 2016-02-03
              • 2017-03-16
              • 2019-05-30
              • 1970-01-01
              相关资源
              最近更新 更多