2009-11-18 82 views
10

Boost線程庫如何與java.util.concurrent庫進行比較?java.util.concurrent與Boost線程庫

性能是至關重要的,所以我寧願留在C++中(雖然現在Java速度更快)。鑑於我必須用C++編寫代碼,所以存在哪些庫可以使線程變得簡單並且不易出錯。

我最近聽說從JDK 1.5開始,Java內存模型被修改爲修復一些併發問題。 C++怎麼樣?上一次我在C++中進行多線程編程時,是在3到4年前使用pthread時。儘管如此,我不希望將它用於大型項目。我知道的唯一另一種選擇是Boost Threads。但是,我不確定它是否好。我已經聽說過關於java.util.concurrent的好東西,但是關於Boost線程還沒有。

+7

馬丁,我認爲它的意思是「Java是快了很多比以前。」 – zedoo 2009-12-26 13:23:07

+7

根據我的經驗,任何時候有人說「性能至關重要」,但沒有具體說明,它根本就不是那麼重要。出於性能原因,請不要選擇C++或Java,請選擇C++或Java,因爲您更熟悉它,或者您覺得編程起來更容易。 – 2009-12-26 16:56:54

回答

10

Boost線程比pthread更容易使用,在我看來,它比Java線程稍微容易使用。當一個boost線程對象被實例化時,它會啓動一個新的線程。用戶提供將在該新線程中運行的函數或函數對象。

這真的很簡單:

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

您可以輕鬆地通過存儲函數對象內部的值傳遞數據的線程。在最新版本的boost中,您可以將可變數量的參數傳遞給線程構造函數本身,然後將其傳遞給函數對象的運算符()

您還可以使用RAII風格的鎖與boost::mutex進行同步。

請注意,C++ 0x將使用相同的語法std::thread

+1

恕我直言,Java併發庫的目的是使多線程比計劃Java線程(它是基於pthreads)更容易 – 2009-12-26 16:54:35

+0

@PeterLawrey pthreads有什麼問題?除非你談論Java中的併發集合,否則這些在pthread中是不可能的。 – 2016-06-01 18:22:23

+1

@IgorGanapolsky pthreads沒什麼問題。我正在指出,將Boost與Java線程進行比較與將Boost與2006年添加的java.util.concurrent進行比較並不相同,這些都比較容易。 parallelStream()API再次更容易。 – 2016-06-01 19:34:25

1

如果你的目標是一個特定的平臺,那麼直接的操作系統調用可能會比使用C++的boost更快。我傾向於使用ACE,因爲您通常可以爲您的主平臺做出正確的調用,並且它仍然是平臺無關的。 Java應該保持相同的速度,只要你能保證它將在最新版本上運行。

+2

Boost.thread比ACE更快,因爲boost使用模板的唯一原因。 boost和ACE都使用相同的OS調用。然而,Boost的編譯代碼非常接近你使用native pthread編寫的代碼。儘管ACE在觸及原生操作系統原語之前必須通過抽象層進行爬網。 Java會有類似的問題,但JVM能夠消除大部分(全部)抽象成本。 – 2009-11-18 21:56:28

+0

不要忘了,ACE側重於跨平臺通信,並增加了許多像Reactor/Proactor框架這樣的更高層次的抽象。所以從這個角度來看,它可能會優先於提升。 – count0 2011-08-27 20:46:24

7

表現明智我不會真的擔心。我的直覺是boost/C++專家可以編寫比Java專家更快的代碼。但任何優勢都不得不爲之奮鬥。

我更喜歡Boost的設計範例到Java的。 Java一直都是OO,如果你喜歡,Boost/C++允許面向對象的使用,但是對於手頭的問題使用最有用的範例。特別是在處理鎖具時我喜歡RAII。 Java處理內存管理很漂亮,但有時感覺像其餘的程序員的資源變得模糊:文件句柄,互斥體,數據庫,套接字等。

Java的併發庫比Boost更廣泛。線程池,併發容器,原子等等,但核心原語相互平行,線程,互斥,條件變量。

因此,對於性能我會說這是洗。如果您需要大量高級併發庫支持Java勝出。如果你更喜歡範式自由C++。

12

java.util.concurrent和boost threads library具有重疊功能,但java.util.concurrent還提供a)更高級別的抽象和b)更低級別的功能。

升壓線程提供:

java.util.concurrent中也具有:

附註:C++目前沒有內存模型。在不同的機器上,相同的C++應用程序可能需要處理不同的內存模型。這使得C++中的可移植併發編程更加棘手。

0

在C++中,如果需要的話,可以直接使用pthreads(pthread_create()等)。內部Java通過運行時環境使用pthreads。做「ldd」看看。

4

如果性能是您的多線程程序中的問題,那麼您應該考慮使用無鎖設計。
無鎖意味着線程不會競爭共享資源,並最大限度地降低轉換成本。在那個部門,Java有一個更好的故事恕我直言,與它的併發集合。您可以快速想出一個無鎖解決方案。
對於使用Boost線程庫稍微(但不是廣泛),我可以說你的想法會受到可用的東西的影響,這意味着本質上是一個鎖定解決方案。
編寫一個無鎖C++解決方案非常困難,因爲缺乏庫支持,並且在概念上也是因爲它缺少一個確保您可以編寫真正不可變對象的內存模型。

本書是一本必讀:Java Concurrency in Practice