2017-12-10 6 views
0

スレッドに関する質問があります。 たとえば、私は、私は、コードmodifeことができる場合の質問は、このいくつかのスレッドで1つの機能を動作させることはできますか?

void xyz(int x){ 

... 
} 

int main{ 

for(int i=0;i<n;i++){ 
xyz(n); 
} 

} 

のようなコードを持っている(とどのように?)ために、最初のスレッドへのn/2の引数1と第2のスレッドの呼び出しAで関数を呼び出しますn/2からnまでの引数を持つ関数。

はあなたがmulti-threadingに関するいくつかのチュートリアルを読んでください、事前

+1

場合これはopenmpの良いユースケースのように思えます。 http://bisqwit.iki.fi/story/howto/openmp/ – drescherjm

+2

はい、これを行うことができます。 C++の最近のリビジョンには、組み込みのスレッドのサポートがあります。 – ForceBru

+3

これは関数 'xyz'の内部で何が起こっているかによって異なります。関数 'xyz'の中で何が起こっていますか? – juanchopanza

答えて

0

でいただきありがとうございます。(モデルはPOSIX threadsに近い)にコンセプトを適用できるので、このPthread tutorialをお勧めします。

reentrantの場合、関数は複数のスレッドで使用できます。

mutexescritical sectionsと同期し、condition variablesを使用してください。 data racesは避けてください。

場合によっては、atomic operationsを使用できます。

(あなたの質問があまりにも広範かつ不明瞭であり、本全体がそれに答えるために必要とされる)

あなたはまたOpenMPOpenACCOpenCLにより興味があるかもしれません。

スレッドは非常に高価なリソースであることに注意してください。それぞれにはcall stack(1〜数メガバイト)があり、一般的に実行可能なスレッドは、利用可能なスレッドよりもはるかに多くしたくありません。cores経験則として、実行可能なスレッド数が12以上(アイドル状態のスレッド数は数百以上、おそらくそれ以下)であることは避けてください(一般的なデスクトップまたはラップトップコンピュータでは避けてください)。しかし、YMMV。私は12ダース以下のスレッドを持っていることを好みますが、私はstd::thread::hardware_concurrencyよりもスレッド数を少なくしようとしています。

両方の回答from Nikos C.from Maroš Beťkoは2つのスレッドを使用しています。もう少し使うことができますが、少なくとも普通のコンピュータでは、もっと多くのもの(例えば100スレッド)を使うのは無理で非効率です。スレッドの最適な量は、コンピュータ(およびソフトウェアとシステム)固有です。プログラムの設定可能なパラメータにすることができます。 supercomputersでは、マルチスレッド化といくつかのMPIアプローチを混在させることができます。データセンターまたはクラスタでは、MapReduceのアプローチを検討することができます。

ベンチマークするときは、compiler optimizationsを有効にすることを忘れないでください。 GCCまたはClangを使用する場合は、少なくともwith-O2 -march=nativeをコンパイルしてください。ここで

1

std::asyncを使用して簡単な解決策とあなたのnを取り込むラムダ関数である:

#include <future> 

int main() { 
    size_t n = 666; 

    auto f1 = std::async(std::launch::async, [n]() { 
     for (size_t i = 0; i < n/2; ++i) 
      xyz(i); 
    }); 
    auto f2 = std::async(std::launch::async, [n]() { 
     for (size_t i = n/2; i < n; ++i) 
      xyz(i); 
    }); 

    f1.wait(); 
    f2.wait(); 
    return 0; 
} 

std::asyncへの各呼び出しは非同期で返さstd::futureの上wait()を呼び出し、新しいスレッドとを作成し、必ずプログラム可能それらのスレッドが終了する前に戻りません。

1

確かに。あなたはこのために<thread>を使用することができます。

#include <thread> 

// The function we want to execute on the new thread. 
void xyz(int start, int end) 
{ 
    for (int i = start; i < end; ++i) { 
     // ... 
    } 
} 

// Start threads. 
std::thread t1(xyz, 1, n/2); 
std::thread t2(xyz, n/2, n); 

// Wait for threads to finish. 
t1.join(); 
t2.join(); 

あなたはGCCやクランを使用している場合は、リンクエラー(例:gcc -std=c++14 myfile.cpp -pthread)を得ればあなたのリンクコマンドに-pthreadを追加することを忘れないでください

+0

'-pthread =' -pthread'は、 '-std = C++ 14'と言っても最近の[GCC](http://gcc.gnu.org/)では必要なくなりましたが、YMMV –

+0

でもGCCバージョン'--std = c + = 11'のために修正されました。 (C++ 11が ''を追加しました) – MSalters

+0

@MSalters GCC 7.2.0とClang git masterを実行していて、どちらも '-pthread'(C++ 11、C++ 14、C++ 17)が必要です。しかし、Linuxディストリビューションパッケージングの問題かもしれませんが、わかりません。 –

関連する問題