5

我想在 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 >.<
4

2 回答 2

6

两件事情。

  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 回答