2016-09-20 35 views
0

は、ループのためにこれを考える:C++同時実行ループを実行することも可能ですか?

std::vector<std::string> V={"element1","element2","element3"}; 

for(int i=V.size(); i--;) 
{ 
std::cout<<i<<std::endl; 
} 

それは同時にforループの各ループを実行することは可能ですか?したがって、各std :: coutは一度に発生しますか?

私は、ループバックして同時にすべてを実行する必要がある関数ポインタのベクトルを持っています。NOT

注:この場合、std :: thread、std :: asyncは完全なヘルプではありません。ベクターのサイズがわからないため、スレッドごとにループを作成して実行する必要があります。これは並行性をもたらさない。

+0

また、http://en.cppreference.com/w/cpp/experimental/parallelism – Hayt

+1

を確認することもできます。出力をstd :: coutにどのように見せたいかをさらに明確にする必要があります。出力の特定の順序が必要ですか? – midor

+1

あなたがスレッドを使用していても、同時に実行するつもりはありません –

答えて

0

実行可能ファイルとは、起動するアプリケーションを別々にすることを意味する場合、スレッドを利用する必要はありません。完了するのを待つことなく、実行可能ファイルを1つのスレッドで1つずつ起動するだけです。 PIDをベクトルに入れることができます。別のループで、これらのプロセスが完了するまで待ってください。

しかし、これがプログラムで行う必要があるのは、bashで書くことをお勧めします。

+0

ここで私は関数ポインタを意味します... –

+0

次にstd :: threadはあなたの友人です。実行したいすべての関数をstd :: threadにラップし、ベクトルに入れてからそれらを待ちます。 –

0

これらの実行可能ファイルは並行して実行できます。これはforループを並行して実行することとはまったく関係がありません。それはあなたのオペレーティングシステムのより多くの機能です。

については、fork()/exec()/system()でプロセスを実行する方法を参照してください。

Windowsの場合、CreatrProcess()でプロセスを実行する方法を調べます。

0

forループの各ループを同時に実行することはできますか?

はい。 C++標準ライブラリは、並行処理を実装するための低レベルのツールを提供します。各反復で新しいスレッドを開始するだけで、すべてのスレッドが開始するまで結合しないでください。

注:ベクトルのサイズがわからないので、std :: thread、std :: asyncはこの場合には完全ではないので、各ループを作成して実行する必要があります..これは並行性をもたらさない。

あなたは間違っています。 std::thread(場合によってはstd::asnycも同様)が有用であり、この場合に並行処理を実装するために使用できます。各ループにスレッドを作成しても、並行性は妨げられません。それ以来、関数ポインタを使用して些細なデモは、あなたが本当に使用しようとしているものです。

std::vector<void(*)()> function_pointers = get_the_stuff(); 
for(auto f : function_pointers) { 
    std::thread t(f); 
    t.detach(); 
} 

別、わずかに、より複雑な、アプローチは、スレッドのベクトルを作成することです。これにより、参加することによってすべてが実行されるまで待つことができます。

-

std::threadや友人は、同時実行のための低レベルのツールであり、それはそれらの上に抽象化を作成する価値があるかもしれない - あるいは第三者によって提供、既存の抽象化を使用します。

また、私はあなたに再考することを強く勧めます。あなたはベクトルの大きさを知らないと言っています。確かに、あなたのハードウェアプロバイダーはベクトルを知りません。すべてのスレッドを並行して実行するのに十分なCPUコアをあなたに提供する方法を知っていますか?より良いアプローチは、余分なスレッドのオーバーヘッドを避けるために、使用可能なコアの数に応じてスレッドの一定のプールを使用することです。

1

これは、OpenMPのための仕事です:

#pragma omp parallel for 
for(int i = 0; i < V.size(); ++i) 
{ 
    std::cout<<i<<std::endl; 
} 

これは、スレッドの固定数を使用しています(通常はそれがCPUスレッドの数です)。 V.size()がそれより大きい場合、すべてのタスクが同時に呼び出されるわけではありません。彼らは利用可能なスレッドを待ちます。

OpenMPを使用できない場合は、サードパーティのライブラリとフレームワークが役立ちます。

0

スレッドを使用して並行性が得られないということをどういう意味ですか? Vを反復してスレッドを作成するforループを使用する代わりに、すべてのスレッドが関数ポインタのベクトルにスレッドを即座に作成したいようにしますか?私はそれが可能だとは思わないし、他の答えが抽象化の異なるレベルで、まったく同じことを終わらせる可能性が非常に高いです。

例コード:

#include <iostream> 
#include <vector> 
#include <thread> 
#include <atomic> 

typedef void (*func)(); 

std::atomic<int> atom; 

void f1() { ++atom; } 
void f2() { atom += 5; } 
void f3() { atom -= 3; } 

int main() 
{ 
    using namespace std; 

    vector<func> func_vec = { &f1, &f2, &f3 }; 
    vector<thread> thread_vec; 

    for (func& f : func_vec) 
     thread_vec.emplace_back(std::thread(f)); 

    for (thread& t : thread_vec) 
     t.join(); 

    std::cout << "Atomic : " << atom; 
} 

がある可能性が高い(両方func_vec上すなわち反復とs thread_vecfunc_vecにセットSサイズ」でthread_vec)thread_vecを埋めるためのより良い方法ですが、それは、例えば罰金です。メインスレッドの実行が終了するまでスレッドを正常に終了させる必要がない場合は、thread_vecを完全に削除してすぐに取り外すスレッドを作成してください。demonstrated

関連する問題