2015-02-10 412 views
0

我正在開發一個C++應用程序,使用pthreads庫。程序中的每個線程訪問一個公共的unordered_map。程序的運行速度比4個線程要慢。我評論了線程中的所有代碼,只留下了標記字符串的部分。單線程執行速度仍然更快,所以我得出結論認爲地圖不是問題。 之後,我在屏幕上打印出線程的ID,並且它們似乎是按順序執行的。C++ Pthreads - 多線程比單線程慢

在調用線程的功能,我有一個while循環,它在一個陣列,其大小是線程數創建線程(讓我們說「TN」)。每次創建線程時,我都會執行一個for循環來加入它們。 (在pthread_join)。雖然運行很多次(不僅僅是4次)。

什麼可能是錯的?

+0

順序,而不是運行在運行您使用的是互斥訪問地圖? – tohava 2015-02-10 15:56:42

+4

我的魔法8球說錯誤在第42行。[即不可能甚至猜測根據代碼可能或不可以做的部分的高級描述。] – 2015-02-10 15:58:05

+0

慢多少?您是否在使用可以從多個線程中受益的體系結構? – odedsh 2015-02-10 15:58:43

回答

5

如果你正在運行一個小的瑣碎程序這往往是因爲工作啓動線程的情況下,優先安排,運行,上下文切換,然後同步實際上可能需要更多的時間,然後運行它作爲一個單一的過程。

的這裏的一點是,瑣碎的問題時也可以運行得更慢。但另一個因素可能是你的CPU實際擁有多少核心。

+0

每個線程都將一個非常大的文本作爲參數。它將其標記並將其詞語添加到地圖中。線程創建一個臨時地圖。然後,當它完成標記時,它會將臨​​時映射添加到常用映射中。我有4個內核。時間乘以〜4。但我試圖刪除有關地圖的代碼,只保留標記...但仍然 – user3309479 2015-02-10 16:05:31

+3

@ user3309479你忘了在問題中提到。 – user2079303 2015-02-10 16:06:36

+1

@ user2079303:該映射必須與互斥鎖同步,以便一次只有一個線程可以使用它。因此,你的代碼被序列化,線程不能幫你。 – 2015-02-10 16:08:23

0

沒有看到代碼,很難說清楚,但可能有一些問題。

你的線程可能沒有足夠的工作來證明他們的創作。創建和運行線程很昂貴,所以如果你的工作量太小,他們不會爲自己付出代價。

執行時間可以花在大多做內存訪問的地圖上,在這種情況下互斥的線程意味着,你是不是真的這樣做實際上很多並行工作(Amdahl定律)。

0

當運行multitthreaded程序,每個線程將依次根據給定的CPU時鐘處理。

如果您有多個內核,您將只有真正的多線程。而在這種情況下,唯一的多線程將是1個線程/核心。

現在,鑑於你(最有可能)有一個核心兩個線程,儘量保持在向CPU產生的開銷記:

  • 爲每個線程分配不同的時鐘時間
  • 同步線程訪問以各種內部CPU操作
  • 其他線程優先級的操作

因此,換句話說,對於一個簡單的應用程序,多線程是實際在性能方面降級。

當你需要一個異步操作時(也就是說你不想等待一個rezult,比如從一個url加載一個圖像或者從HDD那裏加載一個比慢速ram更流暢的幾何圖形),多線程就派上用場了。

在這樣的情況下,應用多線程會導致更好的用戶體驗,因爲你的程序將不掛了,當一個緩慢的操作occurrs。

+0

這個答案似乎有點過時了。現在大多數系統都有多個內核。 – 2015-02-10 16:06:53

+0

你可以考慮這個。但是,如果你有更多的線程,然後核心數量,你會碰到同樣的問題。更重要的是,大多數操作系統都運行多個進程,每個進程都有自己的線程系統。不可避免地,你會在一個CPU問題上遇到多個線程,這會根據優先級爲每個線程分配CPU時鐘。 – MichaelCMS 2015-02-10 16:25:14

0

如果大部分代碼是一個互斥體,將在parllel