11

Boost Thread 库与 java.util.concurrent 库相比如何?

性能至关重要,因此我更愿意继续使用 C++(尽管如今 Java 快得多)。鉴于我必须用 C++ 编写代码,存在哪些库可以使线程处理变得简单且不易出错。

我最近听说,从 JDK 1.5 开始,Java 内存模型已更改以修复一些并发问题。C++ 怎么样?我上一次在 C++ 中进行多线程编程是在 3-4 年前,当时我使用了 pthreads。虽然,我不想再将它用于大型项目。我知道的唯一其他选择是 Boost Threads。但是,我不确定它是否好。我听说过关于 java.util.concurrent 的好消息,但还没有关于 Boost 线程的消息。

4

6 回答 6

12

java.util.concurrent 和boost 线程库具有重叠的功能,但 java.util.concurrent 还提供 a) 更高级别的抽象和 b) 还提供更低级别的功能。

Boost 线程提供:

java.util.concurrent 还有:

附注:C++ 目前没有内存模型。在不同的机器上,相同的 C++ 应用程序可能必须处理不同的内存模型。这使得 C++ 中的可移植、并发编程更加棘手。

于 2009-12-26T13:18:54.303 回答
11

Boost 线程比 pthread 更容易使用,而且在我看来,它比 Java 线程更容易使用。当一个 boost 线程对象被实例化时,它会启动一个新线程。用户提供将在该新线程中运行的函数或函数对象。

这真的很简单:

boost::thread* thr = new boost::thread(MyFunc());
thr->join();

您可以通过在函数对象中存储值来轻松地将数据传递给线程。在最新版本的 boost 中,您可以将可变数量的参数传递给线程构造函数本身,然后将其传递给函数对象的()操作符。

您还可以使用 RAII 样式的锁boost::mutex进行同步。

请注意,C++0x 将对std::thread.

于 2009-11-18T21:05:34.933 回答
7

性能方面我真的不会担心。我的直觉是 boost/c++ 专家可以编写比 java 专家更快的代码。但任何优势都必须争取。

我更喜欢 Boost 的设计范例而不是 Java 的。Java 一直是面向对象的,如果您愿意,Boost/C++ 允许面向对象,但使用最有用的范例来解决手头的问题。在处理锁时,我特别喜欢 RAII。Java 很好地处理了内存管理,但有时感觉就像程序员的其他资源被占用了:文件句柄、互斥体、数据库、套接字等。

Java 的并发库比 Boost 的更广泛。线程池、并发容器、原子等。但核心原语彼此相提并论,线程、互斥体、条件变量。

因此,对于性能,我会说这是一种洗涤。如果您需要大量高级并发库支持 Java 获胜。如果您更喜欢范式自由 C++。

于 2009-11-18T22:06:52.167 回答
4

如果性能是您的多线程程序中的一个问题,那么您应该考虑无锁设计。
无锁意味着线程不会竞争共享资源,从而最大限度地降低切换成本。在那个部门,Java 有一个更好的故事恕我直言,它的并发集合。您可以快速提出无锁解决方案。
由于稍微使用了 Boost Thread 库(但没有广泛使用),我可以说您的想法会受到可用内容的影响,这实际上意味着锁定解决方案。
编写无锁 C++ 解决方案非常困难,因为缺乏库支持,而且在概念上也因为它缺少保证您可以编写真正不可变对象的内存模型。

这本书是必读的:Java并发实践

于 2011-05-11T17:58:20.700 回答
1

如果您针对特定平台,那么直接操作系统调用可能会比使用 C++ 的 boost 快一点。我倾向于使用 ACE,因为您通常可以为您的主平台做出正确的调用,并且它仍然是独立于平台的。只要您可以保证 Java 将在最新版本上运行,Java 的速度应该大致相同。

于 2009-11-18T20:09:24.617 回答
0

在 C++ 中,如果愿意,可以直接使用 pthread(pthread_create() 等)。Java 在内部通过其运行时环境使用 pthread。做“ldd”看看。

于 2010-06-21T21:44:32.030 回答