2011-01-29 7 views
3

私は本質的にforループをスレッドする最良の方法を理解しようとしています。たとえば、次のループがある場合:スレッドでループをC++で

for(int i = 0; i < n; i++) 
    doSomethingThreadSafe(i); 

これはWindowsプラットフォーム上にあります。私は各プロセッサ用のスレッドを作成し、次に各プロセッサ用にできるだけ均等にnを分割しようと試みました。次に、必要なデータを各スレッドに渡してから、WaitForMultipleThreadsを使用します。これを行うより良い方法はありますか?私はブーストのような他のライブラリを使いたくない。

理想的には、私はいくつかの一般的な(テンプレート化された)方法を考えていきたいと思います。すなわち

threaded_for(0, n, doSomethingThreadSafe); 

最高/最も効率的な方法は、ライブラリを追加するために必要とされるであろう、そしてどのように正確には、それがこの例で使用されるだろうどのくらいの作業ライブラリを使用するようになる場合。それでも、私は、他に何かを追加する必要がある解決策を好む。

+3

外部のライブラリを使用したくないので、[OpenMP](http://www.openmp.org/)を使用することはできません。この場合は、実際に使用する必要があります。 – chrisaycock

+0

スレッドで実際に何をしていますか?同期が必要な共有リソースがありますか? – ThomasMcLeod

+0

@ThomasMcLeod同期が不要になるようにすべて設定されています。彼らはすべて独立して行動します。 –

答えて

5

最も簡単な方法はopenMPです.Visual Studioはこれを標準としてサポートしていますが、#pragmaというマジックをループに追加して、使用しているすべてのコアを使用するだけです。 32 OpenMP Traps For C++ Developers

代替 - - これまでで最も効率的な方法ではなく、少し複雑な方法Intel TBB

2

をこの問題を解決するために、doSomethingThreadSafe(i)を想定している学ぶため

ベストな方法は、それをしない方法です基本的に繰り返し命令(複数のデータに対する単一命令)は、chrisaycockが言うようにOpenMPを使うのにです。

#pragma omp parallel for 
for (i = 0; i < n; i++) 
    doSomethingThreadSafe(i); 

実際にはそれよりも単純ではありません。

関連する問題