2012-07-26 14 views
5

Quiero usar multihilo en mi mmorpg en C++, tengo 5 hilos en este momento, y quiero dividir otro en dos, pero mi servidor mmorpg contiene muchos vectores y porque los vectores no son seguros de escribir, no puedo hacerlo correctamente.multiprocesamiento en c en mmorpg

¿Existe alguna alternativa al uso de vectores en los subprocesos, o hay una manera de hacer que el vector de lectura/escritura multirruta sea seguro?

Heres un ejemplo de lo que quiero, trato de encontrar una alternativa a algo como esto: Obviamente, esto no es código real, estoy simplemente haciendo un ejemplo.

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

Respuesta

4

No conozco ninguna clase de vector seguro para subprocesos. Sin embargo, puede crear uno usted mismo que utiliza std::vector y una std::mutex (en C++ 11):

template <typename T> 
class LockedVector { 

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

Se bloquea el mutex con std::lock.

+0

Gracias, ¿pueden explicar cómo usar esto y cómo funciona? :) –

+0

Por favor, eche un vistazo a: http://en.cppreference.com/w/cpp/thread/lock –

+0

Esto no funcionará muy bien. Porque estás bloqueando toda la matriz. Entonces, si bien puede tener múltiples hilos, todos estarán esperando el uno al otro para acceder al vector. Por lo tanto, las operaciones en el vector tendrán las mismas características de rendimiento que si estuvieran en un solo hilo. –

6

Dos cosas.

  1. No almacenar datos compartidos en una gran estructura de datos que se bloquea por completo. Bloquee solo partes de él. Por ejemplo, si debe usar vectores, cree un conjunto de bloqueos para las regiones del vector. Digamos que tengo 1000 entradas, podría crear 10 bloqueos, que cada uno bloquee 100 entradas consecutivas. Pero probablemente puedas hacerlo mejor. Por ejemplo, almacena tus monstruos en una tabla hash, donde cada "cubo" en tu tabla hash tiene su propio candado.

  2. Utilice un bloqueo de "lectura/escritura". Es posible crear un tipo de bloqueo que permita múltiples lectores y un solo escritor. Entonces cada cubo hash puede tener un bloqueo de lectura y escritura. Si no se crean monstruos en un cubo en particular, múltiples hilos pueden leer monstruos de ese cubo. Si necesita colocar un nuevo monstruo en el cubo, bloquee el cubo para escribir. Este bloqueo esperará a que se liberen todos los lectores actuales y no permitirá que más lectores se bloqueen hasta que se complete la escritura. Una vez que no hay más lectores, la operación de escritura tiene éxito

+0

¿Puedes bloquear partes específicas de un vector? ¿O está diciendo que usa varios vectores y los bloquea individualmente? – Drise

+0

Si su vector tiene que reasignarse a medida que crece, entonces tiene que bloquear todo en un cambio de tamaño. Pero a menos que ocurra un cambio de tamaño, y si los elementos pueden permanecer iguales, la compensación de la duración puede bloquear partes individuales de la matriz. Pero ese no es realmente el punto. El punto es usar una estructura de datos que se puede bloquear en partes. Una lista de sub matrices también funcionaría. –

+0

Interesante. Y sí, entendí por qué, simplemente no sabía que puedes bloquear partes de vectores/matrices. – Drise