【问题标题】:Lightweight portable C++ threading轻量级可移植 C++ 线程
【发布时间】:2010-11-15 15:35:06
【问题描述】:

有人知道可以在 Windows、Linux 和 Mac OS X 上运行的轻量级可移植 C++ 线程库吗?

特别是在我的情况下,我做了一个模拟器,每次通过后导出模拟数据。我只想运行一个线程(模拟),它会偶尔启动另一个线程(导出)。唯一的条件是:如果导出线程已启动,请等到它完成,然后再启动一个新线程。

谢谢

【问题讨论】:

    标签: c++ multithreading portability


    【解决方案1】:

    TinyThread++ 呢?

    您的 C++ 需要可移植线程 应用程序?您的 C++0x 是否不可用 目标编译器?也是Boost吗 大吗?

    那么你需要TinyThread++!

    TinyThread++ 实现了一个相当 C++0x 线程的兼容子集 管理类。

    【讨论】:

      【解决方案2】:

      我使用Boost.Thread 并将其推荐给其他人。

      它几乎可以移植到所有东西上并且易于使用。 “轻量级”是唯一的问题,因为我不确定这意味着什么。 Boost 是轻量级的,因为使用它几乎没有开销,因为所有线程功能都是底层线程库(pthreads、Win32 API、Cell BE 等)的松散静态包装。 “互斥锁”实际上是实现“可锁定”概念的任何东西(参见documentation),它可以是任何东西——甚至是你自己的特殊东西。从这个意义上说,它是非常轻量级和可扩展的。

      然而,Boost 是一个巨大的 库,仅提取你需要的部分可能会非常痛苦(这是对 Boost 的普遍抱怨)。在我的脑海中,使用 Boost.Thread 意味着你必须拥有 Boost.DateTime、Boost.System、Boost.ConceptCheck 和 Boost.Compiler(可能还有更多以及依赖的任何东西等)。值得称赞的是,如果你拥有整个库,由于它们的自动链接魔法,很容易构建你需要的东西,但是绝对需要考虑一下,特别是如果 Windows 在目标列表中。

      作为 Boost 的替代方案,我建议您使用 OpenMP,前提是您的编译器支持它。它需要编译器支持一些更高级的功能这一事实可能会使其在“轻量级”方面失去资格,但它在使用上非常轻量级(第一次#pragma omp parallel for 非常简洁)。它不像 Boost 那样功能丰富(我认为只有 Qt 可以在这里竞争),但是使用 OpenMP 可以为您提供一些其他线程库无法提供的非常酷的功能。您必须使用一些现代的编译器,但 GCC 和 MSVC 在这里都有很好的支持。需要注意的是,它实际上是一个 C 库,如果您使用 C++,我认为这是一个劣势,但这对于您的要求可能是一件好事。

      如果您正在寻找更轻量级的东西(在两个意义上),那么我会推荐OpenThreads。它远没有 Boost 那样可扩展,并且性能较差(虽然不是很明显),但它的设计非常好,值得一提。它将命中您指定的所有目标(Windows、OSX 和 Linux),因此,如果它具有您想要的功能,那就去吧。

      另外,Wikipedia。

      【讨论】:

      • 它几乎不是轻量级的。即使是 bcp thread 命令从 boost 中仅选择线程库也会给你 9 MB 的源代码。
      • @noxmetus:这取决于“轻量级”这个词的含义。
      • @Travis Gockel:牛津词典给出了这个词的以下一般含义:“薄材料或构造和重量小于平均水平”。 9 兆字节的源代码,除了线程库本身之外,还包括十几个不同的无关库,这绝对高于平均水平。例如,Windows 的 pthreads 只有 1.9 兆字节。
      • @noxmetus:但源代码的“重量”并不是我关心的。我关心使用开销,Boost 基本上没有。这有意义吗?
      • @noxmetus:因为主题启动器没有指定“轻量级”的含义,我不得不猜测。我的意思是运行时使用开销。您使用的任何外部库都需要经过编译、了解系统和调整构建设置……所以 Boost 在这方面确实没有什么不同。
      【解决方案3】:

      Boot.Thread 是您正在寻找的。在 Boost 的文档页面中引用它的描述

      可移植的 C++ 多线程。

      【讨论】:

      • 轻量级?为什么忽略这个要求?
      • @Matthieu M. 引用@Travis Gockel “这取决于‘轻量级’这个词是什么意思”
      【解决方案4】:

      Boost.Thread 可以在这里工作。

      您可以使用join 等待现有线程完成。

      文档中有其他代码示例,但启动线程看起来像这样:

      struct callable
      {
          void operator()();
      };
      
      boost::thread copies_are_safe()
      {
          callable x;
          return boost::thread(x);
      } // x is destroyed, but the newly-created thread has a copy, so this is OK
      
      boost::thread oops()
      {
          callable x;
          return boost::thread(boost::ref(x));
      } // x is destroyed, but the newly-created thread still has a reference
        // this leads to undefined behaviour
      

      【讨论】:

        【解决方案5】:

        我主要听说过 Boost.Thread 可能很重,Poco.Thread 应该是轻量级的,以及英特尔的 TBB,我不知道它是如何工作的。

        我对 C++0x 做了一些实验,但有人告诉我它对于复杂的实现还不够成熟。

        【讨论】:

          【解决方案6】:

          我使用线程的 c++11 标准来创建一个类多线程,它适用于 Linux、Windows 和 OS X,也许它可以完全为你使用:

          https://github.com/jorgemedra/C-11-Threads/blob/master/README.md

          【讨论】:

            猜你喜欢
            • 2010-11-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-05-06
            • 2019-05-10
            • 1970-01-01
            • 2011-01-12
            相关资源
            最近更新 更多