2012-07-26 12 views
5

私はmmorpgでC++で欲しいと思っています。iveは現時点で5つのスレッドを持っています。もう1つは2つに分割したいのですが、mmorpgサーバーは、ベクトルは書くのにスレッドセーフではありません、私はそれを正しく行うことはできません。マルチスレッドでのCのmmorpg

スレッド間でベクトルを使用する代わりに、またはベクトル読み取り/書き込みマルチスレッドを安全にする方法があります。

Heres私はこのようなものの代替案を見つけようとします: 明らかにこれは実際のコードではありません。

//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

スレッドセーフなベクタークラスは認識していません。しかし、あなたは(C++ 11で)std::vectorstd::mutexを使用して1つを自分で作成することができます。

template <typename T> 
class LockedVector { 

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

あなたはstd::lockのミューテックスをロックします。

+0

ありがとう、どうやって使うのですか? :) –

+0

ご覧ください:http://en.cppreference.com/w/cpp/thread/lock –

+0

これはうまく動作しません。あなたは配列全体をロックしているからです。だから、あなたは複数のスレッドを持つことができます - 彼らはベクトルにアクセスするためにお互いを待っています。したがって、ベクトルに対する操作は、単一のスレッドの場合と同じパフォーマンス特性を持ちます。 –

6

2つのもの。

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

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

+0

ベクトルの特定の部分をロックできますか?あるいは、複数のベクトルを使用してそれらを個別にロックすると言っていますか? – Drise

+0

ベクトルが大きくなるにつれてベクトルを再割り当てする必要がある場合は、リサイズ全体をロックする必要があります。しかし、リサイズが起こらない限り、要素が同じ長さのオフセットにとどまることができれば、配列の個々の部分をロックすることができます。しかし、それは本当にポイントではありません。要点は、部分的にロックできるデータ構造を使用することです。サブアレイのリストも機能します。興味深いもの: –

+0

そして、はい、私は理由を理解しましたが、ベクトル/配列の一部をロックダウンすることができるかどうかは分かりませんでした。 – Drise

関連する問題