2013-02-16 45 views
0

沒有鎖定關鍵部分的C++並行循環,有用PPL實現的parallel_for循環。主要問題在這裏;當我評論cs.lock()和cs.unlock()時,abc向量值不正確。我正在使用concurrency_vector類型來隨機訪問數組值,但它似乎不起作用。鎖定關鍵部分,它工作但很慢。另外,爲了加快速度,我使用索引來存儲值,而不是使用2D-concurrency_vector。什麼問題,沒有鎖定關鍵部分,我錯過了什麼?在下面的代碼中使用PPL

#include <iostream> 
#include <ppl.h> 

using namespace concurrency; 
using namespace std; 

int test_function() 
{ 
    critical_section cs; 

    concurrent_vector<double> abc(300 * 400, 1000); 

    parallel_for (0, 1000, [ & ](int k) { 
     for (int y = 0; y < 300; y++) { 
      for (int x = 0; x < 400; x++) { 

       /// k is using with some calculations for thr 

       cs.lock(); 

       if (thr < abc[ 400 * y + x ]) { 

        abc[ 400 * y + x ] = thr; 
       } 

       cs.unlock(); 
      } 
     } 
    }); 
} 

回答

2

你爲什麼期望它工作?如果這個並行運行沒有鎖定,abc[400*y+x]可以並且將在if語句和賦值之間改變,從而破壞了你的邏輯。矢量類型本身是線程安全的,與此無關。

+0

感謝您快速回答,我是否正確,if語句導致問題,我們應該保護它? – user2055437 2013-02-16 10:11:56

+0

@ user2055437這似乎是這種情況,除非您的計算中有其他事情可能會破壞它。當然這會很慢 - 鎖定/解鎖速度很慢,你需要做很多事情。最後還會有很多不必要的等待。如果您使用粒度鎖定,則可能會看到一些性能改進(創建300 * 400臨界區域,abc的每個元素都有一個,然後使用這些區域進行鎖定)。 – Cubic 2013-02-16 10:15:14

+0

我很抱歉偷你的時間,你可以給一些代碼塊的例子或示例網站,我可以讀最後你說加快的書嗎? – user2055437 2013-02-16 10:21:27