私はマルチスレッドアプリケーションを開発しています。各スレッドは、マップとベクトルのグループから読み取ります (構造の変更はありません)。スレッドはこれらの構造からのみ読み取っているため、これらの構造が読み取られているコードブロックの周りに共有可能なミューテックスを実装する必要があるので、誰でもアドバイスできますか?
1 に答える
読み取り専用のマップ/ベクターの場合、ミューテックスを使用する必要はありません。これはベクトルとマップの両方で既に回答されています
C++03はスレッドについて言及していませんが、C++11にはあなたの質問をカバーする節があります.
23.2.2 コンテナのデータ競合 [container.requirements.dataraces]
1 データ競合 (17.6.5.9) を回避する目的で、実装は次の関数を const と見なす必要があります: begin、end、rbegin、rend、front、back、data、find、lower_bound、upper_bound、equal_range、at and、except in連想コンテナまたは順不同連想コンテナ、operator[]。
2 (17.6.5.9)にもかかわらず、 を除く同じシーケンス内の異なる要素に含まれるオブジェクトの内容が同時にvector<bool>
変更される場合、実装はデータ競合を回避する必要があります。
3 [ 注:vector<int>
サイズが 1 より大きい x、x[1] = 5 および *x.begin() = 10 はデータ競合なしで同時に実行できますが、x[0] = 5 および *x.begin() = 10 は同時に実行されますデータ競合が発生する可能性があります。一般的なルールの例外として、ベクトル < bool > y の場合、y[0] = true は y[1] = true と競合する可能性があります。—終わりのメモ]
したがって、C++11 では、objects を読み取るだけでなく、その異なるオブジェクト (コンテナではなく!) を同時に変更することもできますが、vector < bool > は例外です。