2

我正在寻找适用于 C++ 的轻量级多线程框架。我找到了 POSIX 线程。
请分享您使用 POSIX 线程的实践经验:在开始使用它之前,我想从真实的人那里了解它的优缺点,而不是从 wiki。
如果您实际上将它与任何东西(也许更好)进行了比较,那么了解它们也会很有趣。

UPD:跨平台功能对我来说真的很重要,所以我会很感激所描述的这个方向。

UPD2:我已经体验过 QNX / Win32 的一个框架,但它不是轻量级的,而且 - 哦,我忘了提, - 它是商业的,不是免费的,但我需要一个免费的。

4

8 回答 8

12

我发现Boost.Threads非常好,尤其是在 1.35 重写之后。Windows 上的 POSIX 线程并不是那么简单,它是一个 C API,所以我肯定更喜欢 Boost。它拥有您需要的所有东西,便携且几乎不需要设置。

于 2009-04-27T17:26:27.777 回答
3

另一个 C 线程 API 是来自 GLib 的 GThreads。一些 gthread 和 pthread 调用(例如 pthread_create)之间存在一对一的映射,但 gthread 有两个我发现非常有用的大特性:

  • 线程池和
  • 用于在线程之间发送消息的异步队列。

线程池非常强大,允许动态调整池大小。见http://library.gnome.org/devel/glib/2.20/glib-Threads.html

于 2009-05-01T15:59:08.887 回答
2

POSIX 线程 API 是 C API,而不是 C++。

你想用它做什么?就个人而言,我发现它是一个非常笨拙且过于冗长的 API。但如果您想在类 Unix/Linux 操作系统上进行跨平台开发,这是您最好的选择。它在 Windows 上不受本机支持。

就个人而言,我不会直接在您的代码中使用线程或任何其他依赖于操作系统的 API。在其之上构建另一个抽象层。例如,我们构建了我们所谓的“操作系统层”;一个用于处理线程、信号量、计时器、互斥锁等的 C++ 框架。我们的代码专门使用它。在底层,我们有针对 POSIX、Win32、INTEGRITY 和 vxWorks 的实现。这让我们的代码可以在各种各样的平台上工作。

如果您不想构建自己的层,则可以考虑重用许多其他层,例如 Boost、Qt 等。

于 2009-04-27T17:34:33.777 回答
2

不久前,我在编写的程序中使用了 POSIX。它在 Linux 和 Solaris 上运行良好,实现起来也不是很复杂。另一方面,我的兄弟是一名 Windows 程序员,他更喜欢 Posix。我想这取决于你的目标。我发现 boost 有点臃肿,并且听说过有关它的坏消息。我哥哥认为这是自切片面包以来最棒的事情。我想这是福特vs雪佛兰的事情。每个人都会有意见。

于 2009-04-27T17:38:16.203 回答
2

如果你不喜欢Boost的线程 API,那么你可能想看看POCO的。

于 2009-04-27T17:53:36.273 回答
1

正如你提到的 QNX 看看ACE。它是一个庞大的框架,可用于许多平台(包括 QNX)。其他人已经提到了Boost

建议您使用这些库之一,而不是使用低级、不可移植且容易出错的 C API。

于 2009-04-28T23:41:53.480 回答
1

如果您使用 C++ 工作,Boost 线程库可能是您最好的选择。我在 Unix 和 win32 上都有非常积极的经验。避免 ACE - 糟糕的设计,错误的方法。也看看Intel TBB,虽然我没有在实践中使用它。

于 2009-05-15T00:42:31.893 回答
0

我发现它与 win32 线程 API 非常相似,您需要注意的唯一(真正)区别是 win32 互斥锁在同一个线程上使用时不会阻塞,而 posix 会阻塞。除此之外,它还是一个非常简单的 API。

于 2009-04-27T18:03:12.710 回答