2010-10-10 182 views
4

我知道Linux內核和libc中線程的實現在過去發生了很大變化。從C程序中使用線程的最佳方式是什麼? (我甚至不知道是否有多個API我可以使用 - 我只知道pthreads)當前在Linux中執行線程編程的正確方法

我不在乎太舊的內核和libc版本,但我關心有效利用多核心和可移植性(我可能希望我的代碼也可以在其他Unix上工作)。

如果我只使用man 7 pthreads中描述的Posix線程並將我的代碼限制在POSIX API中,那麼可以嗎?

編輯:謝謝所有回答。我確實想過使用一些可用的線程池庫,但對於這個項目來說,這確實不是一個選項。

回答

3

大多數情況下,是的。這就是POSIX的重點。您計劃移植到的每個平臺(包括操作系統,內核編號和體系結構)可能有一些差異,您需要注意。這是你的作業:)

此外,作爲一個建議,像Qt和像Boost這樣的庫包這樣的框架使得這項工作更加優雅。如果你能整合它們,我強烈推薦它。

0

使用線程很困難且容易出錯。如果可能,避免直接編程。關於這個問題的一篇很好的論文可以在here找到。

除了直接使用線程外,可以通過各種不同的方式實現多核並行。最直接的是多進程並行。對於n核心,運行n處理並細分它們之間的工作量。當任務是粗粒度的並且需要很少或根本不需要通信時,這是最合適的。當它必須處於進程中時,可以使用消息傳遞進行線程之間的所有通信和同步,並嘗試始終將不可變對象作爲消息傳遞。

+0

多進程在同一臺機器上不能很好地擴展,往往需要3-4倍於小任務的工作量(因爲您需要實現一個通信機制,但仍然存在潛在的死鎖,活鎖和所有其他不希望的類型的「鎖定」)。但是,如果您可以不使用此方法,則可能會有更多的加速,因爲您可能能夠減少算法中的阻塞量。 – 2010-10-10 13:03:11

+0

感謝您評論@San。你是對的;如果流程之間需要進行大量的溝通,多個流程不能很好地擴展。我已經修改了我的答案來澄清這一點。 – 2010-10-10 13:06:54

2

POSIX線程是一個不錯的選擇和流行的線程。在使用C/C++進行編程時,您可能還想查看Boost ThreadsIntel Thread Building Blocks以獲取其他選項,而不是直接編碼到POSIX API。具體而言,英特爾TBB聲稱以易於使用和高效的方式使用多核處理器。我對TBB沒有太多的經驗,但我曾經看過使用TBB的演示,其中使用TBB顯着減少了代碼大小和複雜性,並且比使用由經驗豐富的工程師編寫的POSIX線程以直C++編寫的實現快得多。

+0

謝謝!因爲C++不是這個項目的一個選項,所以我想我會使用POSIX API ... – Jay 2010-10-10 15:55:03

+0

不要忘記'fork()'/'clone()'和'mmap()',如果你感覺勇敢... – Jonathan 2010-10-12 19:37:44

相關問題