轻量级便携式C++线程化

9

有没有人了解一款轻量级的可移植C++线程库,可以在Windows、Linux和Mac OS X上使用?

具体来说,在我的情况下,我做了一个模拟器,每次过后都会导出模拟数据。我想运行只有一个线程(模拟)的程序,间歇性地启动另一个线程(导出)。唯一的条件是:如果启动导出线程,请等待它完成后再启动新线程。

谢谢

6个回答

14

那么,TinyThread++怎么样呢?

需要为您的C++应用程序提供可移植的线程吗?您的目标编译器不支持C++0x吗?Boost太大了吗?

那么您需要TinyThread++!

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


12

我使用 Boost.Thread 并且会向其他人推荐它。

它几乎可以在任何地方使用,并且易于使用。唯一的问题是"轻量级",因为我不是很确定这是什么意思。Boost 是轻量级的,因为使用它几乎没有任何开销,因为所有的线程功能都是基础线程库(pthreads, Win32 API, Cell BE等)的松散静态包装。 "Mutex" 实际上是实现 "Lockable" 概念的任何东西(请参见 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

1
它几乎不是轻量级的。即使使用“bcp thread”命令从boost中选择线程库,也会给您提供9兆字节的源代码。 - facetus
2
@noxmetus:这取决于“轻量级”一词的含义。 - Travis Gockel
2
@noxmetus:但我关心的不是源代码的“重量”。我关心的是使用开销,而Boost基本上没有这方面的问题。这样说清楚了吗? - Travis Gockel
2
@noxmetus:由于主题发起人没有明确“轻量级”的含义,所以我只能猜测。我指的是运行时使用开销。您使用的任何外部库都需要通过编译,理解系统并调整构建设置...因此,在这方面Boost并没有太大的区别。 - Travis Gockel
@Travis Gockel:任何源代码都需要编译,是的。在某些情况下,您只需要包含一个头文件。有时将文件添加到项目中,甚至运行make。但是,在这方面,Boost与其他库非常不同。Boost使用独特的构建系统。要正确使用它,您必须知道什么是bjam,如何构建和运行它,什么是user-config.jam,有时在那里添加像“modules.poke common”这样的内容等等...我对此很满意,但它几乎不符合“无使用开销”的定义。 - facetus
显示剩余2条评论

2

Boot.Thread 是您所需的。引用Boost文档页中的描述:

可移植的C++多线程。


1
轻量级?为什么要忽略这个要求? - Matthieu M.
1
@Matthieu M. 引用 @Travis Gockel 的话说:“'轻量级'这个词的意思取决于上下文。” - Scott Chamberlain

2

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

0

0

我主要听说过 Boost.Thread,它可能会很重,Poco.Thread则被认为是轻量级的,而英特尔的 TBB 我不知道它是如何工作的。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接