2012-07-26 62 views
5

我想在我的mmorpg在C++中使用多線程,我現在有5個線程,我想拆分另一個在兩個,但我的mmorpg服務器包含載體的負載,因爲載體無法安全地書寫,我不能正確地做。在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

我不知道任何線程安全的向量類。但是,你可以自己創建一個使用std::vectorstd::mutex(在C++ 11):

template <typename T> 
class LockedVector { 

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

您鎖定與std::lock互斥。

+0

Thankyou,你能解釋一下如何使用它以及它是如何工作的? :) – 2012-07-26 13:33:23

+0

請看看:http://en.cppreference.com/w/cpp/thread/lock – 2012-07-26 13:33:43

+0

這不會工作得很好。因爲你正在鎖定整個陣列。所以,雖然你可以有多個線程 - 他們都將彼此等待訪問矢量。因此,向量上的操作將具有與在單個線程中相同的性能特徵。 – 2012-07-26 13:50:13

6

兩件事。

  1. 不要將共享數據存儲在一個完全鎖定的大數據結構中。鎖定它的一部分。例如,如果您必須使用矢量,則爲矢量的區域創建一組鎖。假設我有1000個條目,我可能會創建10個鎖,每個鎖可鎖定100個連續條目。但你可以做得更好。例如,將怪物存儲在散列表中,散列表中的每個「存儲區」都有自己的鎖。

  2. 使用「讀/寫」鎖。可以創建一種允許多個閱讀器和一個作者的鎖。所以每個哈希桶可能有一個讀寫鎖定。如果沒有在特定的桶中創建怪物,那麼多個線程可以從該桶中讀取怪物。如果您需要將新怪物散列到存儲桶中,那麼您將存儲桶鎖定以進行寫入。此鎖將等待所有當前讀者釋放,並且不允許更多讀者在寫入完成之前鎖定。一旦沒有更多的讀者,這個wRite操作會成功

+0

你可以鎖定矢量的特定部分?或者你是說使用多個向量並單獨鎖定這些向量? – Drise 2012-07-26 13:34:34

+0

如果你的向量必須隨着它的增長而重新分配,那麼你必須在調整大小時鎖定整個事物。但是,除非發生調整大小,並且如果元素可以保持相同的持續時間的偏移量,則可以鎖定數組的各個部分。但那不是重點。關鍵是要使用可以部分鎖定的數據結構。子陣列的列表也可以。 – 2012-07-26 13:47:43

+0

有趣。是的,我明白了爲什麼,只是不知道你可以鎖定向量/數組的一部分。 – Drise 2012-07-26 13:51:08