Hay algunos puntos importantes que creo que deberían agregarse a la excelente respuesta de @Jason.
Primero, el multihilo no siempre es una ilusión, incluso en un solo procesador: hay operaciones que no involucran el procesador. Se trata principalmente de E/S - disco, red, terminales, etc. La forma básica por dicha operación se bloqueo o sincrónica, es decir, el programa espera hasta que se complete la operación y luego procede. Mientras espera, la CPU cambia a otro proceso/subproceso.
si tiene algo que puede hacer durante ese tiempo (por ejemplo, el cálculo de fondo a la espera de la entrada del usuario, sirviendo otra solicitud, etc.) que tienen básicamente dos opciones:
uso E/S asíncrona : llama a sin bloqueo E/S proporcionándole una función de devolución de llamada , diciéndole "llamar a esta función cuando haya terminado". La llamada vuelve inmediatamente y la operación de E/S continúa en segundo plano. Sigues con las otras cosas.
utilizar multiprocesamiento: tiene un hilo dedicado para cada tipo de tarea. Mientras uno espera la llamada de E/S de bloqueo, la otra continúa.
Ambos enfoques son paradigmas de programación difíciles, cada uno tiene sus pros y sus contras.
- con async I/O la lógica de la lógica del programa es menos obvia y es difícil de seguir y depurar. Sin embargo, evita problemas de seguridad de hilo.
- con hilos, el desafío es escribir programas thread-safe. Las fallas de seguridad del subproceso son errores desagradables que son bastante difíciles de reproducir. El uso excesivo del bloqueo puede conducir a la degradación en lugar de mejorar el rendimiento.
(llegando a la multi-procesamiento)
multihilo hizo popular en Windows porque los procesos de manipulación es bastante pesado en Windows (la creación de un proceso, el contexto de conmutación, etc.) en lugar de hilos que son mucho más liviano (al menos este fue el caso cuando trabajé en Win2K).
En Linux/Unix, los procesos son mucho más ligeros. También los subprocesos (AFAIK) en Linux se implementan realmente como un tipo de procesos internos, por lo que no hay ganancia en el cambio de contexto de subprocesos frente a procesos. Sin embargo, debe usar alguna forma de IPC (comunicaciones entre procesos), como memoria compartida, tuberías, cola de mensajes, etc.
En una nota más ligera, mire el SQLite FAQ, que declara "¡Los hilos son malos"!:)
En una máquina multiprocesador con una biblioteca de hilos como boost aprovechará los núcleos disponibles. También puede tener múltiples hilos en un procesador que se pueden intercalar con tecnologías como hyperthreading en Pentium 4. ¿Quiso decir multi-proceso y un sistema distribuido o multi-threading? Puede hacer ambas cosas en realidad, pero la naturaleza de los hilos es obtener paralelismo independientemente del procesador. FYI boost se basa en los hilos de posix hasta donde yo sé y me resulta bastante fácil de usar. Además, el nuevo estándar C++ 0x incluirá el soporte de subprocesos nativo del idioma. – AJG85
¿Qué opinas sobre Boost e Intel TBB? Es más rápido que Intel TBB? ¿O debería buscar Intel si tengo un procesador Intel? – Nazka
Intel TBB tiene la ventaja en algunas áreas donde proporciona primitivas paralelas optimizadas como bucles for-parales paralelos, etc., que ayudan en la creación de algoritmos de estilo de dispersión dispersa en paralelo en procesadores Intel, así como en otros cálculos paralelos. Boost Threads es principalmente un paquete de threads multiplataforma que se ejecutará en muchos tipos de hardware y plataformas de sistema operativo. Sin embargo, si necesita ciertas primitivas computacionales paralelas, Boost Threads no las proporciona directamente, tendría que codificarlas usted mismo. Entonces, podrías ver a TBB como a un nivel de abstracción más alto que Boost. – Jason