4

複数のスレッドがアイテムを同時に変更/挿入できるようにする配列のようなデータ構造を実装したいと思います。パフォーマンスに関してどうすれば入手できますか?std :: vectorの周りにラッパークラスを実装し、スレッドの同期にクリティカルセクションを使用しました。以下の私のコードを見てください。スレッドが内部データを処理するたびに、他のスレッドを待たなければならない場合があります。したがって、その性能は良くないと思います。:(何かアイデアはありますか?

class parallelArray{
private:
    std::vector<int> data;
    zLock dataLock; // my predefined class for synchronizing
public:
    void insert(int val){
         dataLock.lock();
         data.push_back(val);
         dataLock.unlock();
    }

    void modify(unsigned int index, int newVal){
         dataLock.lock();
         data[index]=newVal; // assuming that the index is valid
         dataLock.unlock();
    }
};
4

2 に答える 2

1

Boostライブラリのshared_mutexを見てください。これにより、複数のリーダーを使用できますが、ライターは1人だけです。

http://www.boost.org/doc/libs/1_47_0/doc/html/thread/synchronization.html#thread.synchronization.mutex_types.shared_mutex

于 2011-09-26T12:19:41.623 に答える
0

最良の方法は、高速のリーダーライターロックを使用することです。読み取り専用アクセスには共有ロックを実行し、書き込み可能アクセスには排他ロックを実行します。このようにして、読み取り専用アクセスが同時に実行されます。

ユーザーモードのWin32APIには、Vista以降で使用可能なスリムリーダー/ライター(SRW)ロックがあります。

Vistaの前は、リーダーライターロック機能を自分で実装する必要があります。これは非常に簡単な作業です。1つのクリティカルセクション、1つのイベント、および1つの列挙型/整数値でそれを行うことができます。良い実装にはもっと手間がかかりますが、私はローカル(スタック割り当て)構造の手作りのリンクリストを使用して、公平な待機キューを実装します。

于 2011-09-26T10:12:18.390 に答える