有没有人了解一款轻量级的可移植C++线程库,可以在Windows、Linux和Mac OS X上使用?
具体来说,在我的情况下,我做了一个模拟器,每次过后都会导出模拟数据。我想运行只有一个线程(模拟)的程序,间歇性地启动另一个线程(导出)。唯一的条件是:如果启动导出线程,请等待它完成后再启动新线程。
谢谢
有没有人了解一款轻量级的可移植C++线程库,可以在Windows、Linux和Mac OS X上使用?
具体来说,在我的情况下,我做了一个模拟器,每次过后都会导出模拟数据。我想运行只有一个线程(模拟)的程序,间歇性地启动另一个线程(导出)。唯一的条件是:如果启动导出线程,请等待它完成后再启动新线程。
谢谢
那么,TinyThread++怎么样呢?
需要为您的C++应用程序提供可移植的线程吗?您的目标编译器不支持C++0x吗?Boost太大了吗?
那么您需要TinyThread++!
TinyThread++实现了一个相当兼容的C++0x线程管理类子集。
我使用 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 ++,那可能是一个劣势,但对于你的要求来说,这也可能是一件好事。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
我使用c++11标准的线程来创建一个多线程类,它适用于Linux、Windows和OS X,也许对你有用:
https://github.com/jorgemedra/C-11-Threads/blob/master/README.md
我主要听说过 Boost.Thread,它可能会很重,Poco.Thread则被认为是轻量级的,而英特尔的 TBB 我不知道它是如何工作的。
我尝试了一些 C++0x 的实验,但有人告诉我它还不够成熟,无法用于复杂的实现。