1

私は数を計算する関数を持っているので、PPL を使用して並列化しました。ただし、別の開発者が何らかの理由でこの関数をシリアルで実行する必要がある..シリアル モードで関数を呼び出すことができるように、パラメーターを指定する必要があります。 ...コードを複製したくないので、PPL スレッドの数を制限する方法が必要です..

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

PPL は 2 つのスレッドを作成し、コードを並行して実行します...ppl 拡張コードをシリアル化する方法についての提案。

4

1 に答える 1

1

この問題については、スケジューラポリシーを設定せず、手動のタスクグループ初期化制御を使用することをお勧めします。次に例を示します。

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 ); });
    });
}

1つの仮想プロセッサのすべてのタスクを制限する場合は、MinConcurrencyも設定します。

CurrentScheduler::Create( SchedulerPolicy( 2, Concurrency::MinConcurrency, 1, Concurrency::MaxConcurrency, 1 ) );
于 2012-11-02T16:21:38.770 に答える