1

我有一個數字運算函數,所以我通過使用PPL並行它..但是另一個開發人員需要這個函數以串行方式運行,因爲某些原因..我需要給一個參數,以便他可以調用我的函數串行模式......我不想重複代碼,所以我需要一種方法來限制PPL threads..Although的數量我傷心如何將PPL線程數設置爲1?

Concurrency::SchedulerPolicy sp(1, Concurrency::MaxConcurrency, 1); 
CurrentScheduler::Create(sp); 

PPL創建兩個線程運行我的並行代碼...有關如何序列化一個ppl增強代碼的任何建議。

+1

如果您爲函數構建一個重載/參數化它,那麼您可能會更高興,這樣您就可以轉向串行版本。 – Rick 2012-07-23 16:29:28

+0

重載該函數將導致公佈較低層次的功能,因爲並行化處於幾個級別。我不願意追隨超載..將來維護將很難處理......無論如何感謝 – 2012-07-24 06:05:20

+1

告訴其他開發者從他/她的代碼/數據中獲取所有全局變量,靜態變量等,以便它不會物? – 2012-07-24 06:34:35

回答

0

對於這個問題,最好不要設置調度策略,並使用一些手動任務組初始化控制,例如:

using namespace Concurrency; 

std::vector< task_handle< std::function< void() > > > aTask; 
aTask.push_back(make_task([](){ /*taks 1*/})); 
aTask.push_back(make_task([](){ /*taks 2*/})); 
aTask.push_back(make_task([](){ /*taks 3*/})); 

task_group tGroup; 

bool bSerialMode = true; /* or false */ 
if (!bSerialMode) 
{ 
    std::for_each(aTask.begin(), aTask.end(), [&](task_handle< std::function< void() > >& handle){ 
     tGroup.run(handle); 
    }); 
} 
else 
{ 
    tGroup.run([&](){ 
     std::for_each(aTask.begin(), aTask.end(), [&](task_handle< std::function< void() > >& handle){ 
     tGroup.run_and_wait(handle); }); 
    }); 
} 

如果你決定要限制一個虛擬處理器的所有任務,然後設置MinConcurrency了。

CurrentScheduler::Create(SchedulerPolicy(2, Concurrency::MinConcurrency, 1, Concurrency::MaxConcurrency, 1)); 
+0

感謝您的努力......自從我提出這個問題以來,我已經有一段時間了,所以我無法嘗試您的建議,但它似乎適用於某種程度。當我再次檢查問題時,發現不需要代碼重複。 – 2014-02-04 20:55:43