在mmorpg中的多线程

Hea*_*ent 5 c++ multithreading thread-safety

我想在我的mmorpg中使用多线程在c ++中,我现在有5个线程,我想将另外一个分成两个,但我的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 >.<
Run Code Online (Sandbox Code Playgroud)

Raf*_*sta 6

两件事情.

  1. 不要将共享数据存储在一个完全锁定的大数据结构中.锁定它的一部分.例如,如果必须使用向量,则为向量的区域创建一组锁.假设我有1000个条目,我可能会创建10个锁,每个锁定100个连续条目.但你可能会做得更好.例如,将您的怪物存储在哈希表中,其中哈希表中的每个"桶"都有自己的锁.

  2. 使用"读/写"锁.可以创建一种允许多个读者和一个编写者的锁.因此每个哈希桶可能具有读写锁.如果没有在特定存储桶中创建怪物,则多个线程可以从该存储桶中读取怪物.如果您需要将新怪物哈希到桶中,那么您可以锁定桶进行写入.此锁定将等待所有当前读取器释放,并且在写入完成之前不允许更多读取器锁定.一旦没有更多的读者,那么手术就会成功


Man*_*Way 4

我不知道有任何线程安全向量类。但是,您可以自己创建一个使用std::vectorand a std::mutex(在 C++11 中):

template <typename T>
class LockedVector {

private:
    std::mutex m;
    std::vector<T> vec;
};
Run Code Online (Sandbox Code Playgroud)

您可以使用 锁定互斥锁std::lock