2012-04-20 113 views
3

我正在用C++語言編寫一個使用多線程的庫。由於我在Windows中開發它,因此我使用「Windows.h」中的方法和數據結構(如CreateThread,HANDLE WINAPI等)。便攜式C++多線程

現在我想讓這個代碼可以在Windows和Linux中執行;你能向我建議一些線程實現嗎?

這個應用程序的主要要求是執行速度,所以我需要一些快速的實現。

提前致謝。

+6

C++ 11標準庫支持多線程。 – cmannett85 2012-04-20 14:07:37

+0

@ cbamber85 - 是的,這是事實,但要警惕基於此的一攬子建議。 C++ 11的實際編譯器支持(一個非平凡的任務)正在進行並且是可變的。 – 2012-04-20 14:41:38

+0

@SteveTownsend你說得對,我認爲海灣合作委員會的併發支持與C++ 11語言支持處於類似的水平 - 事實證明它遠不及。 – cmannett85 2012-04-20 16:16:46

回答

11

到目前爲止,最好的辦法是使用新的std :: threads庫,這是可移植的,標準化的,並以現代風格編寫。

std::thread my_thread(my_func, my_param); 

http://en.cppreference.com/w/cpp/thread

如果您沒有訪問C++ 11(VC10和> 4.4的gcc應該是罰款),那麼的std ::線程都或多或少偉大的研究與開發boost :: threads,boost庫是跨平臺和可移植的(至少它將支持主要的操作系統,包括Win32 & linux)。

http://www.boost.org/doc/libs/1_49_0/doc/html/thread.html

最後,如果你正在尋找parallelising算法它可能是值得的,同時檢查出英特爾TBB,這是一個現代的C++線程庫,它提供了類似於STD並行結構::算法

tbb::for_each(my_contaier.begin(), my_container.end(), my_func); 

http://threadingbuildingblocks.org/

+0

我在Windows中使用早期的boost線程庫有一些小問題。線程運行正常,但關閉應用程序生成了一個AV。它可能在以後的版本中都是固定的 - 我認爲我有1。35,這是很多老::( – 2012-04-20 14:15:24

+0

根據這個線程已知的問題在VC10中'std :: thread'。最新的Boost可能是一個更好的賭注在此期間http://stackoverflow.com/questions/9421235/ stdthread-class-in-vc-11-causes-random-crashes-any-workarounds – 2012-04-20 14:40:37

+0

@MartinJames 1.35舊,在這個問題上沒有任何權重 – 111111 2012-04-20 15:06:45

1

的boost ::線程解決方案也是在新的標準C++ 11的std ::線程。

1

作爲替代方案,一個相當便攜式(*)和相對非侵入性的文庫,以及支撐在g ++以及(與舊版本)上MSVC是OpenMP

它不是標準的C++,但OpenMP本身是一個標準。它讓你paralllelize循環很容易:

#pragma omp parallel for 
for (int i=0; i!=x; ++i) { 
} 

它也有任務和定時功能(及以上),但在我看來這是王紀律是上面所示例並行。


(*)如果你留在編譯指示,它不是不可移植的。