2010-11-15 71 views
9

有誰知道輕量級可移植C++線程庫,可以在Windows,Linux和Mac OS X上工作嗎?輕量級可移植C++線程

特別是在我的情況下,我做了一個模擬器,在每次通過後輸出模擬數據。我想只運行一個線程(模擬),它會偶爾啓動另一個線程(導出)。唯一的條件是:如果導出線程開始等待,直到完成,在開始一個新的。

感謝

回答

13

什麼TinyThread++

需要便攜式線程爲您的C + + 應用程序?您的 目標編譯器的C++ 0x不可用?太升 大?

然後你需要TinyThread ++!

TinyThread ++實現了相當的 兼容子集的C++ 0x線程 管理類。

+0

沒有聽說過這個,謝謝 – 2010-11-15 17:35:28

+0

非常好,謝謝。 – 2010-11-15 22:44:45

12

我用Boost.Thread並會推薦給別人。

這是幾乎所有的便攜式和易於使用。 「輕量級」是唯一的問題,因爲我不確定這意味着什麼。因爲所有的線程功能都是針對底層線程庫(pthreads,Win32 API,Cell BE等)的鬆散靜態封裝,所以Boost是輕量級的,因爲幾乎沒有使用它的開銷。 「互斥體」實際上是實現了「可鎖定」概念的任何東西(請參閱documentation),它可以是任何東西 - 甚至是您自己特殊的東西。從這個意義上講,它非常輕便和可擴展。

然而,升壓是巨大庫和拉只是它需要可以是非常痛苦的組成部分(這是對一般的升壓一個常見的抱怨)。關閉我的腦海,使用Boost.Thread意味着你必須有Boost.DateTime,Boost.System,Boost.ConceptCheck和Boost.Compiler(可能更多,以及其他依賴的東西等等)。值得稱讚的是,如果你擁有整個圖書館,因爲它們的自動鏈接魔法,建立你所需要的東西非常容易,但是需要全部考慮,特別是如果Windows在目標列表中的話。

作爲Boost的替代方案,假設您的編譯器支持它,我會推薦OpenMP。事實上,它需要編譯器支持某些更高級的功能,可能會使其不符合「輕量級」的要求,但它在使用上非常輕量級(您第一次使用#pragma omp parallel for非常簡潔)。它不像Boost那樣功能豐富(我認爲只有Qt可以在這裏競爭),但是使用OpenMP給你一些非常酷的功能,沒有其他線程庫可以做。你將不得不使用一個有點現代的編譯器,但是GCC和MSVC都有很好的支持。有一點需要注意的是,它實際上是一個C庫,如果你在使用C++,我認爲它是一個缺點,但這對你的需求可能是一件好事。

如果你正在尋找更輕巧的東西(在這個詞的兩個意義上),那麼我會推薦OpenThreads。它遠不如Boost那樣可擴展,並且性能較差(雖然不是很明顯),但它設計得非常好,值得一提。它會觸及你指定的所有目標(Windows,OSX和Linux),所以如果它具有你想要的功能,就去做吧。

另外,Wikipedia

+1

這是幾乎不輕。即使是一個'bcp thread'命令來從boost中選擇線程庫也會給你9兆字節的源代碼。 – noxmetus 2010-11-15 17:33:44

+2

@noxmetus:這取決於「輕量級」這個詞的含義。 – 2010-11-15 18:02:14

+0

@Travis Gockel:「牛津字典」給出了這個詞的以下一般含義:「薄材料或者構建並且稱重_平均值_」。 9兆字節的源代碼除了線程庫本身之外還包括十幾種不相關的庫,絕對不止是平均值。 Windows的pthreads例如只有1.9兆字節。 – noxmetus 2010-11-20 12:18:18

2

Boot.Thread是你在找什麼。引用其在Boost的文檔中的描述

便攜式C++多線程。

+0

輕便?爲什麼忽略這個要求? – 2010-11-15 17:06:19

+1

@Matthieu M.引用@Travis Gockel「這取決於什麼」輕量級「這個詞的意思是」 – 2010-11-15 18:17:36

2

Boost.Thread會在這裏工作。

您可以使用join等待現有線程完成。

有在文檔中其他代碼示例,但啓動一個線程是這樣的:

struct callable 
{ 
    void operator()(); 
}; 

boost::thread copies_are_safe() 
{ 
    callable x; 
    return boost::thread(x); 
} // x is destroyed, but the newly-created thread has a copy, so this is OK 

boost::thread oops() 
{ 
    callable x; 
    return boost::thread(boost::ref(x)); 
} // x is destroyed, but the newly-created thread still has a reference 
    // this leads to undefined behaviour 
0

我大多聽說過Boost.Thread可能很重,Poco.Thread應該是輕量級的,而Intel的TBB我不知道它是如何工作的。

我用C++ 0x做了一點實驗,但是我被告知它還不夠成熟,但對於複雜的實現。