【发布时间】:2010-11-15 15:35:06
【问题描述】:
有人知道可以在 Windows、Linux 和 Mac OS X 上运行的轻量级可移植 C++ 线程库吗?
特别是在我的情况下,我做了一个模拟器,每次通过后导出模拟数据。我只想运行一个线程(模拟),它会偶尔启动另一个线程(导出)。唯一的条件是:如果导出线程已启动,请等到它完成,然后再启动一个新线程。
谢谢
【问题讨论】:
标签: c++ multithreading portability
有人知道可以在 Windows、Linux 和 Mac OS X 上运行的轻量级可移植 C++ 线程库吗?
特别是在我的情况下,我做了一个模拟器,每次通过后导出模拟数据。我只想运行一个线程(模拟),它会偶尔启动另一个线程(导出)。唯一的条件是:如果导出线程已启动,请等到它完成,然后再启动一个新线程。
谢谢
【问题讨论】:
标签: c++ multithreading portability
TinyThread++ 呢?
您的 C++ 需要可移植线程 应用程序?您的 C++0x 是否不可用 目标编译器?也是Boost吗 大吗?
那么你需要TinyThread++!
TinyThread++ 实现了一个相当 C++0x 线程的兼容子集 管理类。
【讨论】:
我使用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 的源代码。
Boot.Thread 是您正在寻找的。在 Boost 的文档页面中引用它的描述
可移植的 C++ 多线程。
【讨论】:
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
【讨论】:
我主要听说过 Boost.Thread 可能很重,Poco.Thread 应该是轻量级的,以及英特尔的 TBB,我不知道它是如何工作的。
我对 C++0x 做了一些实验,但有人告诉我它对于复杂的实现还不够成熟。
【讨论】:
我使用线程的 c++11 标准来创建一个类多线程,它适用于 Linux、Windows 和 OS X,也许它可以完全为你使用:
https://github.com/jorgemedra/C-11-Threads/blob/master/README.md
【讨论】: