2

2 つの異なる omp_lock_t を作成し、それらを互いに独立してロックできると想定しました。次のコード セクションを gcc 4.4 と gcc 4.6.1 でテストしたところ、同じ出力が得られました。

omp_lock_t lockA;
omp_lock_t lockB;
omp_init_lock(&lockA);
omp_init_lock(&lockB);

std::cout << "Lock B is: " omp_test_lock(&lockB) << "\n";
omp_set_lock(&lockA);
std::cout << "Lock A set\n";
std::cout << "Lock B is: " omp_test_lock(&lockB) << "\n";

omp_set_lock(&lockB);
...

このコードは、次の出力を生成します。

Lock B is: 1
Lock A set
Lock B is: 0

次に、omp_set_lock(&lockB) の試行でデッドロックします。

2 つの異なるロックを作成して、それらを個別に使用することはできませんか? 可能であれば、これらのロックを設定する正しい方法は何ですか?

ありがとう

4

1 に答える 1

3

コードは期待どおりに機能します。私はあなたが何をするかについて誤解していると思いますomp_test_lock(特に名前が明らかに非常に誤解を招くため)。

omp_test_lock ロックを取得しようとします。ただしomp_set_lock、そうでない場合は、ロックを正常に取得するまでブロックされません。しかし、それが唯一の違いです。特に、最初の「テスト」(単なるテストではない)lockBが取得された後、2番目の「テスト」が失敗し、その後のomp_set_lock(&lockB)デッドロックが発生するのはそのためです。

そして、これを明確にするために:はい、複数のロックを使用できます。

omp_lock_t lockA;
omp_lock_t lockB;
omp_init_lock(&lockA);
omp_init_lock(&lockB);

omp_set_lock(&lockA);
std::cout << "Lock A set\n";
omp_set_lock(&lockB);
std::cout << "Lock B set\n";
…

このコードはデッドロックしません。

于 2012-06-14T16:21:51.667 に答える