java.util.concurrent与Boost Threads库

时间:2009-11-18 20:01:27

标签: java c++ multithreading boost-thread java.util.concurrent

Boost Thread库如何与java.util.concurrent库进行比较?

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

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

6 个答案:

答案 0 :(得分:12)

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

Boost线程提供:

java.util.concurrent还有:

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

答案 1 :(得分:11)

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

这真的很简单:

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

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

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

请注意,C ++ 0x将使用std::thread的相同语法。

答案 2 :(得分:7)

表现明智我不会真的担心。我的直觉是,boost / c ++专家可以编写比java专家更快的代码。但任何优势都必须为之奋斗。

我更喜欢Boost的Java设计范例。 Java一直是OO,如果你愿意,Boost / C ++允许使用OO,但是对于手头的问题使用最有用的范例。特别是在处理锁时我喜欢RAII。 Java可以很好地处理内存管理,但有时候感觉其他程序员的资源都会受到影响:文件句柄,互斥体,数据库,套接字等。

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

所以对于表演,我会说这是一个洗。如果您需要大量高级并发库支持Java获胜。如果你更喜欢范式自由C ++。

答案 3 :(得分:4)

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

这本书必读:Java Concurrency in Practice

答案 4 :(得分:1)

如果您的目标是特定平台,那么直接OS调用可能比使用boost for C ++快一点。我倾向于使用ACE,因为你通常可以为你的主平台做出正确的调用,它仍然是平台无关的。只要你可以保证它将在最新版本上运行,Java应该具有相同的速度。

答案 5 :(得分:0)

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