2012-07-26 17 views
5

voglio usare il multithreading nel mio mmorpg in C++, Ive ha ottenuto 5 discussioni in questo momento, e voglio dividere un altro a due, ma i miei conists del server mmorpg di carichi di vettori, e perché i vettori non sono sicuri da scrivere, non posso farlo correttamente.multithreading in C in un mmorpg

c'è un'alternativa all'utilizzo di vettori attraverso i thread, o c'è un modo per rendere il vettore di lettura/scrittura multithread sicura.

Ecco un esempio di cosa non voglio, provare a trovare un'alternativa a qualcosa di simile: Ovviamente questo non è un codice reale, sto solo facendo un esempio.

//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 >.< 

risposta

4

Non sono a conoscenza di alcuna classe di vettore thread-safe. Tuttavia, è possibile creare uno voi stessi che utilizza std::vector e std::mutex (in C++ 11):

template <typename T> 
class LockedVector { 

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

di bloccare il mutex con std::lock.

+0

Grazie, puoi spiegare come usare questo e come funziona? :) –

+0

Si prega di dare un'occhiata a: http://en.cppreference.com/w/cpp/thread/lock –

+0

Questo non funzionerà molto bene. Perché stai bloccando l'intero array. Quindi, mentre puoi avere più thread - saranno tutti in attesa l'uno dell'altro per accedere al vettore. Quindi le operazioni sul vettore avranno le stesse caratteristiche di prestazioni come se fossero in un singolo thread. –

6

due cose.

  1. Non conservare i dati in un unico grande struttura di dati che viene bloccato completamente condiviso. Blocca solo alcune parti di esso. Ad esempio, se è necessario utilizzare i vettori, quindi creare un set di blocchi per le regioni del vettore. Diciamo che ho 1000 voci, potrei creare 10 blocchi, che ogni blocco 100 voci consecutive. Ma probabilmente puoi fare di meglio. Ad esempio, memorizza i tuoi mostri in una tabella hash, in cui ogni "bucket" nella tabella hash ha il proprio lock.

  2. Utilizzare una serratura "lettura/scrittura". È possibile creare un tipo di blocco che consenta più lettori e un singolo writer. Quindi ciascun bucket hash potrebbe avere un blocco di scrittura in lettura. Se nessun mostro viene creato in un determinato bucket, più thread possono leggere i mostri da quel bucket. Se hai bisogno di distruggere un nuovo mostro nel secchio, chiudi il secchio per scrivere. Questo blocco attenderà che tutti i lettori attuali vengano rilasciati e non permetterà a più lettori di bloccarsi finché la scrittura non sarà completa. Una volta che non ci sono più lettori, l'operazione wite è

+0

È possibile bloccare parti specifiche di un vettore? O stai dicendo di usare più vettori e bloccarli individualmente? – Drise

+0

Se il vettore deve riallocarsi mentre cresce, è necessario bloccare l'intera operazione su un ridimensionamento. Ma a meno che non si verifichi un ridimensionamento e se gli elementi possono rimanere allo stesso l'offset per la durata, allora è possibile bloccare singole parti dell'array. Ma non è questo il punto. Il punto è utilizzare una struttura dati che può essere bloccata in parti. Funzionerebbe anche una lista di sottoarray. –

+0

Interessante. E sì, ho capito perché, semplicemente non sapevo che puoi bloccare parti di vettori/array. – Drise