在mmorpg中的多线程

时间:2012-07-26 13:25:03

标签: c++ multithreading thread-safety

我想在c ++中的mmorpg中使用多线程,目前我有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 >.<

2 个答案:

答案 0 :(得分:6)

两件事。

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

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

答案 1 :(得分:4)

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

template <typename T>
class LockedVector {

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

您使用std::lock锁定互斥锁。