2013-01-31 14 views
0

基本上我有一個任務和一個線程類,我創建的線程數量等於物理內核(或邏輯內核,因爲在英特爾CPU內核上它們是雙倍數)。如果僅創建一次,使用數百個線程安全嗎?

所以基本上線程從任務列表中獲取任務並執行它們。但是,我必須確保一切安全,並且多個線程不會一次嘗試執行相同的任務,當然這會引入額外的開銷(和頭痛)。

我把任務功能放在線程中嗎?我的意思是 - 而不是4個線程從200個任務池中抓取任務,爲什麼不是200個線程以4 * 4組的方式執行,基本上我不需要同步任何東西,不鎖定,沒有任何東西。當然,我不會在整個運行時創建線程,只是在初始化時。

這樣的方法有什麼優點和缺點?我可以簡化的一個問題是 - 因爲我只在初始化時創建線程,所以它們的計數是固定的,而在任務中,我可以繼續在任務池中傾倒更多任務。

+1

你會如何只有四個線程運行?當然你需要以某種方式同步這個動作? – GManNickG

+0

看起來你是在生產者消費者隊列之後。這裏有一些很好的閱讀:http://www.1024cores.net/home/lock-free-algorithms/queues – Carl

回答

1

線程有成本 - 每個線程都需要TLS和堆棧的空間作爲最小。

0

保持你的任務和線程類的分離將是一個更清潔,更長久的管理方法,並通過允許限制在任何給定時間創建和運行的線程數量來降低開銷(另外,任務是可能比Thread更少佔用內存,並且在需要時創建和釋放更快)。任務是控制完成的東西。線程是在任務運行時控制的。是的,您需要將Task對象存儲在線程安全列表中,但使用臨界區,互斥鎖,信號量等實現起來非常簡單。特別是在Windows上,您可以使用I/O完成端口將任務提交給線程,並讓操作系統爲您處理同步化和時間安排。

0

一次運行200個線程肯定需要更長的時間,而不是運行4個線程來運行200個「任務」。你可以通過一個簡單的程序來測試這個簡單的程序,它可以做一些簡單的數學運算(例如,計算第一個20000000的素數,要求每個線程一次執行100000個數字,然後抓取下一個數字,或者製作200個線程,每個數字爲100000個數字)。

慢多少?不知道,取決於很多事情。

相關問題