首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mmorpg中c语言的多线程

mmorpg中c语言的多线程
EN

Stack Overflow用户
提问于 2012-07-26 21:25:03
回答 2查看 309关注 0票数 5

我想在c++的mmorpg中使用多线程,我现在有5个线程,我想把另一个一分为二,但是我的mmorpg服务器包含了大量的向量,而且因为向量不是线程安全的,所以我不能正确地写。

是否有替代跨线程使用向量的方法,或者是否有方法使向量读/写多线程安全。

这里有一个我不想要的例子,试着找到一个类似这样的东西的替代品:很明显,这不是实际的代码,我只是做一个例子。

代码语言:javascript
复制
//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 >.<
EN

回答 2

Stack Overflow用户

发布于 2012-07-26 21:32:58

两件事。

  1. 不要将共享数据存储在一个完全锁定的大数据结构中。只锁定其中的一部分。例如,如果必须使用向量,则为向量的区域创建一组锁。假设我有1000个条目,我可能会创建10个锁,每个锁有100个连续的条目。但你也许可以做得更好。例如,将怪物存储在哈希表中,其中哈希表中的每个“存储桶”都有自己的锁。
  2. 使用“读/写”锁。可以创建一种允许多个读取器和单个写入器的锁。因此,每个散列存储桶可能都有一个读写锁。如果在特定的存储桶中没有创建怪兽,那么多个线程可以从该存储桶中读取怪兽。如果您需要将一个新的怪物散列到存储桶中,那么您可以锁定存储桶以进行写入。此锁将等待所有当前读取器释放,并且在写入完成之前不允许更多的读取器锁定。一旦没有更多的读取器,写入操作将成功执行
票数 6
EN

Stack Overflow用户

发布于 2012-07-26 21:30:38

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

代码语言:javascript
复制
template <typename T>
class LockedVector {

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

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11670314

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档