java.util.concurrent与Boost线程库

java.util.concurrent与Boost线程库,java,c++,multithreading,boost-thread,java.util.concurrent,Java,C++,Multithreading,Boost Thread,Java.util.concurrent,Boost线程库与java.util.concurrent库相比如何 性能非常重要,所以我更愿意继续使用C++(虽然java现在速度快了很多)。考虑到我必须在C++中编码,存在哪些库使线程更容易,并且不易出错。p> 我最近听说,从JDK1.5开始,Java内存模型已经更改,以解决一些并发性问题。C++怎么样?上次我在C++中做多线程编程是在3-4年前,当我使用pPults的时候。尽管如此,我不希望在大型项目中再使用它。我所知道的唯一其他选择是Boost线程。不过,我不确定这是否好。关于JavaU

Boost线程库与java.util.concurrent库相比如何

性能非常重要,所以我更愿意继续使用C++(虽然java现在速度快了很多)。考虑到我必须在C++中编码,存在哪些库使线程更容易,并且不易出错。p>


我最近听说,从JDK1.5开始,Java内存模型已经更改,以解决一些并发性问题。C++怎么样?上次我在C++中做多线程编程是在3-4年前,当我使用pPults的时候。尽管如此,我不希望在大型项目中再使用它。我所知道的唯一其他选择是Boost线程。不过,我不确定这是否好。关于JavaUTI.Orthon,我听到了一些好消息,但是关于线程的提升,还没有什么。

< P>如果你瞄准一个特定的平台,那么直接OS调用可能比使用Boost C++更快。我倾向于使用ACE,因为您通常可以对您的主平台进行正确的调用,并且它仍然是独立于平台的。只要您能保证Java将在最新版本上运行,Java的速度应该是相同的。

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

这其实很简单:

boost::thread* thr = new boost::thread(MyFunc());
thr->join();
通过将值存储在函数对象中,可以轻松地将数据传递给线程。在最新版本的boost中,您可以将数量可变的参数传递给线程构造函数本身,然后将其传递给函数对象的
()
操作符

您还可以将RAII样式的锁与
boost::mutex
一起用于同步


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

使用相同的语法,从性能角度看,我并不担心。我的直觉是,boost/c++专家可以比java专家编写更快的代码。但任何优势都必须争取

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

Java的并发库比Boost的更广泛。线程池、并发容器、原子等,但是核心基元与彼此、线程、互斥体、条件变量保持一致。 所以,就表演而言,我认为这是一场洗礼。如果您需要大量高级并发库支持,那么Java wins。如果你喜欢范式自由C++,

java. UTI.Orthand,并且具有重叠的功能,但是java. UTI.Realm也提供了更高级别的抽象,B)还提供了较低级别的函数。 Boost线程提供:

  • 线程(Java:Java.util.Thread)
  • 锁定(Java:and)
  • 条件变量(Java.and)
  • 屏障(Java:)
java.util.concurrent还具有:

  • 并发数据结构,例如a或a
  • 服务业作为一个高度灵活的消费者-生产者体系
  • 行动

一个侧面注释:C++目前没有内存模型。在不同的机器上,相同的C++应用程序可能需要处理不同的内存模型。这使得在C++中的可移植的并发编程更加棘手。C++中的

< P>可以直接使用pTrices(pthRead SkEATE())等。Java内部通过其运行时环境使用pthreads。做“LDD”看看。

< P>如果在多线程程序中性能是一个问题,那么你应该考虑一个无锁设计。 无锁意味着线程不竞争共享资源,从而最小化切换成本。在这个部门,Java有一个更好的故事IMHO,它的并发集合。您可以快速想出无锁解决方案。
由于使用了一点Boost线程库(但没有广泛使用),我可以说您的想法将受到可用内容的影响,这意味着本质上是一个锁定解决方案。
编写一个无锁C++解决方案是非常困难的,因为缺少库支持,而且概念上是因为缺少一个内存模型,它保证了可以编写真正的不可变对象。
这本书是必读的:

Boost.thread比ACE快,唯一的原因是Boost使用模板。boost和ACE都使用相同的操作系统调用。然而,Boost的编译代码与使用本机pthread编写的代码非常接近。而ACE在接触本机操作系统原语之前,必须爬过抽象层。Java也会有类似的问题,但JVM能够消除大部分(全部?)抽象成本。不要忘记ACE专注于跨平台通信,并添加了许多更高级别的抽象,如Reactor/Proactor框架。因此,从这个角度来看,它可能比boost更受欢迎。Martin,我认为这意味着“Java比以前快多了。”根据我的经验,任何时候有人说“性能至关重要”,但没有具体说明,其实根本就没有那么重要。不要选择C++或java来执行性能,选择C++或java,因为你更熟悉它,或者你发现在.imo中编程更容易。java并发库的目的是使多线程比计划Java线程(基于pthon)更容易。PeterLawrey:pPrices有什么不对?除非你说的是Java中的并发集合,否则在pthreads中这些是不可能的。@IgorGanapolsky pthreads没有错。我的意思是,将Boost与Java线程进行比较与比较Boos不同