2009-04-21 29 views
5

En mi copia de C Programming Language (también conocido como K & R), parece que no hay mención de multihilo. ¿Es el libro menos completo de lo que imaginaba? ¿Surgió el multihilo después de haber sido escrito? ¿Estoy pensando en esto de la manera incorrecta?C multi-threading origen

¿Dónde encaja el concepto de multihilo en el mundo C?


Editar: Creo que mi pregunta original han sido:

  • se puede escribir nada en C
  • existe multihilo
  • no se puede escribir multihilo en C <-lógica contradicción

¿Qué explica esta contradicción? ¿Dónde está el origen del multihilo? Si es POSIX, ¿en qué está escrito POSIX si no es C? ¿Una forma de ensamblaje que es inaccesible para C?

+0

El multihilo no es parte del lenguaje C. Puede ser agregado por bibliotecas de terceros, por supuesto, pero el lenguaje C en sí no tiene ningún concepto de enhebrado. – jalf

+0

@jalf en realidad hay enhebrado en el estándar C11, tuvieron que agregarlo para que pudieran definir el modelo de memoria, pero la mayoría de las cosas de soporte todavía están en la biblioteca estándar. – Spudd86

+0

Tenga en cuenta que mi comentario es de 2009;) – jalf

Respuesta

14

C es un lenguaje de nivel bastante bajo. El soporte para subprocesos en un programa C típico proviene del sistema operativo, no del tiempo de ejecución de C: si su entorno no admite subprocesos, tendrá que implementarlos usted mismo, buscar una biblioteca que lo haga o dejar de utilizar subprocesos. Esto está en contraste con un lenguaje como Java, donde el entorno de tiempo de ejecución proporciona muchos servicios que están garantizados para estar disponibles para los programas Java, ya sea que el SO subyacente los soporte de la manera en que la plataforma Java los expone o no.

Ahora, una vez dicho esto, estoy bastante seguro de que cuando se publicó la primera edición de K & R, Unix no admitía subprocesos. Como C se implementó por primera vez como un lenguaje de sistemas para el entorno Unix, no sorprende que no tenga soporte nativo de hilos.

Si va a escribir código para un entorno Unix, busque los hilos POSIX si necesita una API bien apoyado por la implementación de programas multihilo en C.

4

El libro está completo. C es capaz de ejecutar subprocesos, pero solo con soporte desde el tiempo de ejecución en el que se encuentra. C no admite muchas cosas de forma nativa. Por ejemplo, si desea abrir un archivo u obtener información del mouse, necesitará una biblioteca que le brinde ese soporte. Esto es bueno de alguna manera porque significa que C puede ejecutarse en una pequeña computadora incorporada y no necesita mucha memoria para funciones que puede o no desear.

multihilo fue de alrededor de camino antes de C. (Eso es de acuerdo a lo siguiente: http://www.cs.clemson.edu/~mark/multithreading.html)

Se necesita un librería de hilos. Por ejemplo, en las ventanas se puede:

#include "Windows.h" 

int main() 
{ 
    CreateThread(/*Google the function for details of the parameters.*/); 
    return 0; 
} 

Usted tendrá que descargar el SDK de la plataforma de Windows de hacer eso. La mayoría de las plataformas tienen algún tipo de SDK que tendrá una biblioteca con algunas funciones para crear subprocesos. La mayoría tiene una función de estilo CreateThread, donde pasa la dirección de una función en la que desea que el hilo recién iniciado comience a ejecutarse en paralelo a su hilo actual que comenzó en la función principal.

Una biblioteca de subprocesamiento estándar que es posible que desee buscar es posix.

3

Si no recuerdo mal, el multihilo fue realmente utilizado mucho más tarde que el lenguaje de programación C. La biblioteca POSIX Threads es la forma típica de hacer subprocesos múltiples en un programa Unix/Linux, y no es parte de la biblioteca estándar.

+0

Lo maravilloso de los estándares es que hay muchos para elegir. Los hilos no son parte de ISO C (ISO/IEC 9899: 1999); Los hilos POSIX son parte de POSIX (ISO/IEC 9945-1: 2003, aunque el estándar POSIX es IEEE 1003.1-2008). –

1

El multihilo (o multiprocesamiento) seguramente surgió antes de eso. Sin embargo, el soporte de subprocesos múltiples en un lenguaje de programación es escaso incluso ahora, particularmente C no tiene ninguno. Así que creo que deberías leer un libro, por ejemplo. Cadenas POSIX, o cualquier soporte de subprocesos que le brinde su entorno (las bibliotecas de subprocesos son muy similares entre sí hoy en día, al menos en los principios de sus primitivas de sincronización, cosas extrañas como RCU solo se usan en entornos específicos).

1

Se menciona que en mi copia (2ª edición), en el capítulo Introducción (Pág. 2):

Del mismo modo, C ofrece solamente, el flujo de control de un solo hilo sencillo: pruebas, loops, agrupando , y subprogramas, pero no multiprogramación, operaciones paralelas, sincronización o corutinas.

2

Los idiomas C y C++ no incluyen las bibliotecas integradas de subprocesos. Por lo tanto, las diferentes plataformas tenían diferentes paradigmas wrt threads (PThreads, la función WinAPI CreateThread (..), subprocesos MFC, etc.).

C++ 0x will include a standard thread library, parece.