5

C++ の mmorpg でマルチスレッドを使用したいのですが、現時点で 5 つのスレッドがあり、別のスレッドを 2 つに分割したいのですが、私の mmorpg サーバーは多数のベクトルで構成されており、ベクトルはスレッドセーフではないので、私はそれを正しく行うことはできません。

スレッド間でベクトルを使用する代替手段はありますか、またはベクトルを読み取り/書き込みマルチスレッドセーフにする方法はありますか?

私が望んでいないものの例を次に示します。次のようなものに代わるものを見つけてみてください。明らかに、これは実際のコードではありません。例を作成しているだけです。

//Thread1
//Load monster and send data to the player
globals::monstername[myid];//Myid = 1 for now -.-
senddata(globals::monstername[myid]);//Not the actual networking code, im just lazy.

//Thread2
//Create a monster and manage it
globals::monstername.push_back("FatBlobMonster");
//More managing code i cant be bothered inserting >.<
4

2 に答える 2

6

2つのこと。

  1. 完全にロックされる 1 つの大きなデータ構造に共有データを格納しないでください。その一部だけをロックします。たとえば、ベクトルを使用する必要がある場合は、ベクトルの領域に対して一連のロックを作成します。1000 個のエントリがあるとします。10 個のロックを作成し、それぞれが 100 個の連続するエントリをロックします。しかし、おそらくもっとうまくやれるでしょう。たとえば、モンスターをハッシュ テーブルに格納します。ハッシュ テーブルの各「バケット」には独自のロックがあります。

  2. 「読み取り/書き込み」ロックを使用します。複数のリーダーと単一のライターを許可するタイプのロックを作成することができます。そのため、各ハッシュ バケットには読み書きロックが設定されている場合があります。特定のバケットでモンスターが作成されていない場合、複数のスレッドがそのバケットからモンスターを読み取っている可能性があります。新しいモンスターをバケットにハッシュする必要がある場合は、書き込みのためにバケットをロックします。このロックは、現在のすべてのリーダーが解放されるのを待ち、書き込みが完了するまで他のリーダーがロックすることを許可しません。リーダーがなくなると、書き込み操作は成功します

于 2012-07-26T13:32:58.280 に答える
4

スレッドセーフなベクター クラスを認識していません。std::vectorただし、およびを使用するものを自分で作成できますstd::mutex(C++ 11 の場合):

template <typename T>
class LockedVector {

private:
    std::mutex m;
    std::vector<T> vec;
};

でミューテックスをロックしstd::lockます。

于 2012-07-26T13:30:37.687 に答える