2008-10-13 17 views
5

Soy un desarrollador un poco nuevo con algunos años en mi haber. Recientemente me entrevisté en una compañía de juegos y me preguntaron "¿has hecho algún tipo de subprocesamiento múltiple?" Les conté acerca de tener una aplicación C# con algunos hilos ... y luego dije un poco sobre transacciones y bloqueo, etc. en Sql. El entrevistador cortésmente me dijo que esto era de muy alto nivel y que están buscando a alguien con experiencia haciendo multi-threading en C++.¿Cuál es un ejemplo básico de multi-threading de "bajo nivel" en C++?

Entonces, ¿qué es un ejemplo básico de multi-threading de "bajo nivel" en C++?

+1

C# Es lo mismo que de él dijo que prefería Java;?) – paxos1977

Respuesta

12

La implementación canónica de "hilos de bajo nivel" es pthreads. Los ejemplos más básicos de problemas de subprocesamiento que generalmente se enseñan junto con pthreads son alguna forma de readers and writers problem. Esa página también enlaza con problemas de enhebrado más clásicos como productores/consumidores y filósofos gastronómicos.

2

Echaré un vistazo a http://zthread.sourceforge.net/ que es una excelente envoltura alrededor de la biblioteca PThreads. Es una biblioteca muy rápida y estable, y puede ser bastante baja. Muy bien escrito y documentado.

2

No creo que haya mucha diferencia entre lo que has estado haciendo y el uso de pthreads, para ser honesto. Si ha trabajado mucho con hilos, habrá tenido todos los problemas con el bloqueo, la sincronización, etc., y podría retomar el uso de las llamadas pthreads directamente y con la suficiente facilidad. Lo único que es un poco complicado que probablemente haya estado aislado es la terminación, obtener códigos de salida de los hilos, etc.

(Por supuesto, pthreads no es tan bajo como se puede obtener; en linux, mira clone() para ver cómo funciona realmente en un nivel de llamada del sistema. Pero nadie lo usa a menos que implemente pthreads.)

3

Aquí hay un ejemplo rápido del uso de pthreads, basado en algunos código de prueba nuestro. Engendra dos hilos y espera a que se completen.

int main(void) 
{ 
    pthread_t reader, writer; 
    void *arg; 

    // [... initialisation ...] 

    // Spawn threads 
    if(pthread_create(&reader, NULL, reader_func, arg) || 
     pthread_create(&writer, NULL, writer_func, arg)) 
    { 
     perror("pthread_create"); 
     return EX_OSERR; 
    } 

    // Wait while threads run 
    pthread_join(reader, &arg); 
    pthread_join(reader, &arg); 

    return EX_OK; 
} 

void *reader_func(void *arg) 
{ 
    // [... do some stuff ...] 
    return NULL; 
} 

void *writer_func(void *arg) 
{ 
    // [... do some different stuff ...] 
    return NULL; 
} 
1

bien si realmente quieres llevar esta idea al "máximo" y estás dispuesto a ensuciarte las manos con los hilos. Recomendaría tratar de implementar una biblioteca de hilos de espacio de usuario.

mire en uconext.h y sus diversos procedimientos (setcontext, swapcontext y makecontext) y trate de escribir con ellos una simple biblioteca de hilos cooperativos. implementar bloqueos, condicionar la creación/destrucción del hilo de variables y el rendimiento cooperativo. No será particularmente elegante (es decir, no existe un paralelismo real (para eso necesitas buscar en éter la llamada al sistema clónico o el kernel) pero si puedes hacerlo, nadie podrá decir que no tienes bajo nivel de experiencia

Solo para dar una idea de la escala del proyecto. Escribí una biblioteca de hilos tan simple en aproximadamente 500 líneas de C++, y considerando que al menos el 20% de eso eran comentarios, afirmaciones y registro para propósitos de depuración.

3

probablemente se refería al uso de C#, no su experiencia de rosca.

1

también Boost Threads es bastante envoltura portátil alrededor pthreads e hilos de Windows y ... por lo que he escuchado, muchas tiendas de desarrollo de juegos usan C++ y algunas de las bibliotecas de Boost.

3

Si se trata de una compañía de juegos, entonces es probable que quieran una respuesta algo como esto:

"Me implementa una rutina AI multiproceso que asigna los cálculos del árbol de decisiones para NPC entre los recursos de CPU disponibles.El bloqueo correcto, especialmente cuando se integra el código con el resto de la aplicación, fue difícil. También pasamos un tiempo de seguimiento de la utilización de recursos para cada subproceso para que pudiéramos desacelerar el proceso de AI cuando amenazaba con interferir con la capacidad de respuesta principal de la interfaz de usuario."

(he hecho todo eso, yo personalmente no he hecho realmente nada de eso . sonrisa)

Cuestiones relacionadas