2013-06-29 75 views
0

我有幾個關於多線程的問題,我是新的C++ 11多線程。多線程使用vC++ 11

  1. 我想我的算法的一些塊移動到不同的線程,但是,一旦塊內,操作應按順序進行。例如,一個線程標記字符串和其他線程將這些標記轉換爲double/float。 什麼是實現這一目標的最佳方式。我知道std :: lock,但是,它是有代價的。原子怎麼樣?

  2. 如果我在獨立的內核中創建線程,會更加優化嗎? VS2012具有使用內核的parallel_for/parallel_for_each。

  3. 什麼是標準考慮何時使用parallel_for/parallel_for_each和std :: thread?

回答

0

對於您的第一點,您正在尋找的是一個多線程鎖定隊列,您可以將它用作線程之間的緩衝區和通信媒介。有了這個,你就可以形成一條處理流水線,就像現實生活中的工廠一樣,每個線程都可以從一個隊列中處理元素並將結果放到另一個隊列中。

在這種情況下,嘗試最簡單的事情就是讓使用某種隊列,std::deque例如一類,即由一個std::mutex保護併發訪問,並使用std::condition_variable或其他類似機制通知時隊列中有可用的數據(用於消費者)。

然後用這些新塊實現你的算法,並對它進行基準測試,看看它是否實際上更快,因爲使用現代處理器和緩存,它可能更容易使算法單線程化,並且只需多次並行運行。

0

大多數情況下,你根本不想爲簡單的序列使用單獨的線程,如標記字符串,然後將標記轉換爲雙精度。

恰恰相反,當你在線程中拆分一個任務時,你希望找到不需要按順序完成的事情,恰恰相反,你通常希望儘量減少線程之間的交互作爲儘可能多

因此,不是讓一個線程標記化,而是另一個轉換爲double,您通常更喜歡將標記化和轉換放在一起,但將輸入分成幾個大的數據塊,每個數據塊將由單個線程處理。

即使這可能最終會做很少(如果有的話)實際不錯。我首先在單個線程中編寫代碼,然後進行一些分析。鑑於標記和轉換數據涉及少量的處理,單線程將能夠處理足夠快的速度以使用所有可用的內存帶寬,這是非常好的機會。在這種情況下,使用更多線程不太可能產生真正的好處,除非您使用的系統可能(例如)在完全獨立的處理器上運行多個線程,因此可用內存帶寬會擴大(至少在某種程度上)以及您使用的核心。

多個線程將(至少潛在地並且通常實際上)在多個核心上運行。 parallel_for/parallel_for_each旨在簡化某些特殊情況下的並行處理,因此您可以獲得多線程的效果,而無需跳過幾乎所有的火焰箍,以確保正確的行爲。

當您希望線程執行異構處理時,可以使用std::thread而不是parallel_for(或類似)的顯而易見的條件。 parallel_for基本上只需要循環的迭代並行執行它們。如果你的處理沒有(大部分)發生在像這樣的單個循環中,那麼std::thread可能會產生更好的結果。