我想在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 >.<
答案 0 :(得分:6)
两件事。
不要将共享数据存储在一个完全锁定的大数据结构中。锁定它的一部分。例如,如果必须使用向量,则为向量的区域创建一组锁。假设我有1000个条目,我可能会创建10个锁,每个锁定100个连续条目。但你可能会做得更好。例如,将您的怪物存储在哈希表中,哈希表中的每个“桶”都有自己的锁。
使用“读/写”锁定。可以创建一种允许多个读者和一个编写者的锁。因此每个哈希桶可能具有读写锁。如果没有在特定存储桶中创建怪物,则多个线程可以从该存储桶中读取怪物。如果您需要将新怪物哈希到桶中,那么您可以锁定桶进行写入。此锁定将等待所有当前读取器释放,并且在写入完成之前不允许更多读取器锁定。一旦没有更多的读者,那么手术就会成功
答案 1 :(得分:4)
我不知道任何线程安全的矢量类。但是,您可以自己创建一个使用std::vector
和std::mutex
(在C ++ 11中)的文件:
template <typename T>
class LockedVector {
private:
std::mutex m;
std::vector<T> vec;
};
您使用std::lock
锁定互斥锁。