これを行う際の危険の解決策は何ですか?OpenMPを使用したスレッドセーフカウンタ
#include <iostream>
#include <unistd.h>
#include <cstdlib>
#include <ctime>
int main(){
int k = 0;
#pragma omp parallel for
for(int i = 0; i < 100000; i++){
if (i % 2){ /** Conditional based on i **/
#pragma omp atomic
k++;
usleep(1000 * ((float)std::rand()/RAND_MAX));
#pragma omp task
std::cout << k << std::endl; /** Some sort of task **/
}
}
return 0;
}
私はすべてk
が一意である必要があります。これを行う良い方法は何でしょうか?
編集this questionは私が共有変数に基づいてタスクを起動したい。特に集計
を指し、どのよう
注意してください。私は競争状態に陥る危険があります。
スレッド2が完了し、条件付きでtrueを評価し、スレッド1がすべてのタスクを生成する前にkをインクリメントするとします。
編集編集
強制的に競合状態にしました。睡眠なしでは明らかではなかった。実際には問題があります。どのように私はこれを克服することができます。
は、ここでは簡単なソリューションです:
...
#pragma omp atomic
k++;
int c = k;
...
が、私は保証したいと思います。
接線。なぜこの実装は機能しませんか?関数の最後に
...
int c;
#pragma omp crtical
{
k++;
c = k;
}
...
、std::cout << k;
、私はすぐに私の質問に答えることを憎むが、私は、この特定のインスタンスのための解決策を見つけた予想50000出力proof
[OpenMpで共有変数を管理する方法](http://stackoverflow.com/questions/14569954/how-to-manage-shared-variable -in-openmp) – Igor
@Igor回答のハイライト表示の相違点を修正しました –
'c ==(i + 1)/ 2'の' 'k == 50000'のように、 。しかし、ループ中に 'std :: cout << c'を実行し、parllelループの外側のクリティカルセクション内で' k'だけ読み込むべきです。 – Zulan