0

私の質問: 「読み取り専用」の const_accessors を使用すると、プログラムがフリーズするのはなぜですか?

API の説明から、1 つのアクセサーと複数の const_accessors (ライター、リーダー) を持つことは問題ないようです。誰かが私に別の話をしてくれるかもしれません。

私が達成しようとしている目標は、この同時ハッシュ マップを使用し、10 ~ 200 のスレッドで利用できるようにして、情報を検索および追加/削除できるようにすることです。私が現在使用しているソリューションよりも優れたソリューションがある場合は、代替案を投稿してください。

tbb::size_t hashInitSize = 1200000;
concurrent_hash_map<long int,char*> hashmap(hashInitSize);
cout << hashmap.bucket_count() << std::endl;

long int l = 200;
long int c = 201;

    concurrent_hash_map<long int,char*>::accessor o;
    concurrent_hash_map<long int,char*>::const_accessor t;
    concurrent_hash_map<long int,char*>::const_accessor h;

    cout << "Trying to find 200 "<< hashmap.find(t,200) << std::endl;

    hashmap.insert(o,l);
o->second = "testother";

TBB コミュニティ チュートリアル ガイドページ 43 では、アクセサの概念について説明しています。

4

1 に答える 1

1

TBBリファレンスマニュアルから:

アクセサーは、 内のペアへのスマート ポインターとして機能しますconcurrent_hash_mapreleaseインスタンスが破棄されるか、アクセサーでメソッドが呼び出されるまで、ペアの暗黙的なロックを保持します。

アクセサーは、使用時にロックを取得します。複数のアクセサーが同時に存在できます。ただし、プログラムが複数のアクセサーを同時に使用し、ロックを解放しない場合、デッドロックが発生する可能性があります。

デッドロックを回避するには、アクセスが完了したら、ハッシュ マップ エントリのロックを解放します。

于 2012-07-08T18:25:27.503 に答える