2008-09-26 11 views
7

Me pregunto qué idiomas admiten (o no son compatibles) con multihilo nativo, y tal vez obtener algunos detalles sobre la implementación. Con suerte, podemos producir una descripción completa de esta funcionalidad específica.¿Qué idiomas de alto nivel admiten multithreading?

+0

Esto no es un problema de idioma, es un problema de implementación. Como la pregunta no tiene sentido, propongo que se lea con respecto a las implementaciones. – Marcin

+0

Estoy de acuerdo con Marcin en que debe leerse con respecto a las implementaciones. La razón por la que lo pregunté de esta manera es que asumí que la mayoría de los idiomas compartían la capacidad de paralelizar entre implementaciones. Por ejemplo, C y C++ tienen hilos independientemente del compilador que utilice. – bmdhacks

Respuesta

4

Las versiones anteriores de C y C++ (a saber, C89, C99, C++ 98 y C++ 03) no tienen soporte en el lenguaje central, aunque las bibliotecas como los hilos POSIX están disponibles para casi todos plataforma en usuario común hoy.

Las versiones más nuevas de C y C++, C11 y C++ 11 tienen soporte para enhebrar integrado en el idioma, pero es una función opcional de C11, por lo que las implementaciones como sistemas integrados de un solo núcleo pueden elegir para apoyarlo mientras apoya el resto de C11 si lo desean.

+0

Eso ya no es verdad en C++ 11. –

+0

@MaxBeikirch: Gracias, era verdad hace 5,5 años, cuando esta respuesta se escribió por primera vez, antes de que C++ 11 existiera :). –

+0

Absolutamente :) Ahora su respuesta es correcta y puedo votarla positivamente;) –

1

Creo que la VM oficial de squeak no es compatible con los hilos nativos (SO), pero sí con la versión Gemstone.

(No dude en editar esto si no es correcto).

1

Debe definir "nativo" en este contexto.

Java reivindica algún tipo de subprocesamiento múltiple integrado, pero solo se basa en el bloqueo de granularidad gruesa y cierto soporte de biblioteca. En este momento, no es más 'nativo' que C con los hilos POSIX. La próxima versión de C++ (0x) también incluirá una biblioteca de subprocesos.

1

sé Java y C# multithreading apoyo y que la próxima versión de C++ apoyará directamente ... (La ejecución prevista está disponible como parte de las bibliotecas boost.org ...)

+0

Las API multiproceso C# son estúpidas. Hay tres formas de hacerlo, ninguna de las cuales "lo tiene todo". La manera simple funciona, a menos que necesite resultados del hilo. El resultado obtenido es mucho más complicado y conceptualmente diferente (no recuerdo los nombres de la API ahora, lo siento). – akauppi

0

Perl y Python hacer. Ruby está trabajando en ello, pero los hilos en Ruby 1.8 no son realmente hilos.

+0

¿Podría definir qué son realmente los hilos, y de qué manera, digamos que los subprocesos de JRuby o XRuby o Ruby.NET o IronRuby son "en realidad no hilos"? Todas las implementaciones de Ruby 1.8 implementan subprocesos del sistema operativo verdaderamente concurrentes, paralelos y nativos sin un bloqueo global. ¿Qué más quieres de un hilo? –

+0

Eso es para JRuby, XRuby o Ruby.net. Ese no es el rubí que usa la mayoría de la gente. –

1

Boost::thread es genial, aunque no estoy seguro de si puedes decir su parte del lenguaje. Depende si considera que CRT/STL/Boost es parte de C++, o una biblioteca complementaria opcional.

(de lo contrario, prácticamente ningún idioma tiene enhebrado nativo, ya que todos son una característica del sistema operativo).

3

Con CPython, hay que recordar sobre el GIL. En resumen: solo se usa un procesador, incluso en máquinas multiprocesador. Hay varias formas de evitar esto, como muestra el comentario.

+0

Esto no es verdad. Hay múltiples implementaciones de Ruby y Python que admiten verdaderos hilos paralelos: XRuby, Ruby.NET, JRuby, IronRuby, Jython, IronPython y posiblemente otros. –

+0

Corregí mi declaración inicial, demasiado genérica. –

6

Erlang tiene una función de soporte para concurrent programming.

Estrictamente hablando, los procesos de Erlang son comodines. Pero el lenguaje y la máquina virtual están diseñados desde cero para admitir la concurrencia. El lenguaje tiene estructuras de control específicas para la mensajería entre procesos asíncrona.

En Python, greenlet es un paquete de terceros que proporciona subprocesos livianos y mensajes basados ​​en canales. Pero no soporta la comparación con Erlang.

2

Delphi/FreePascal también tiene soporte para hilos.

Supongo, por otras respuestas, que es solo nativo en las plataformas de Windows.

Algunas bibliotecas agradables que implementan mejores características en la parte superior del objeto TThread:

2

Esta pregunta no tiene sentido: si una implementación en particular decide implementar subprocesos como subprocesos nativos o subprocesos verdes no tiene nada que ver con el idioma, que es un detalle de implementación interna.

Existen implementaciones Java que utilizan subprocesos nativos e implementaciones Java que utilizan subprocesos verdes.
Existen implementaciones de Ruby que utilizan subprocesos nativos e implementaciones de Ruby que usan subprocesos verdes.
Hay implementaciones de Python que utilizan subprocesos nativos e implementaciones de Python que usan subprocesos verdes.
Incluso hay implementaciones de subprocesos POSIX que utilizan subprocesos verdes, p. la antigua biblioteca LinuxThreads o la biblioteca GNU pth.

Y el hecho de que una implementación utilice subprocesos nativos no significa que estos subprocesos realmente se pueden ejecutar en paralelo; muchas implementaciones utilizan un bloqueo de intérprete global para garantizar que solo se pueda ejecutar un subproceso a la vez. Por otro lado, el uso de hilos verdes no significa que no puedan ejecutarse en paralelo: el BEAM Erlang VM, por ejemplo, puede programar sus hilos verdes (más precisamente, procesos verdes) en varios núcleos de CPU, lo mismo está planeado para el Rubinius. Ruby VM.

1

Perl no es compatible con los subprocesos nativos.

Sí, hay un módulo de subprocesos Perl, y sí, utiliza subprocesos de plataforma nativa en su implementación. El problema es que no es muy útil en el caso general.

Cuando crea un nuevo hilo usando hilos Perl, copia todo el estado del intérprete Perl. Esto es muy lento y usa mucha RAM. De hecho, es probablemente más lento que usar fork() en Unix, ya que este último usa copy-on-write y los hilos Perl no.


Pero, en general, cada idioma tiene su propio modelo de subprocesamiento, algunos son diferentes de los demás. Python (principalmente) usa subprocesos nativos de plataforma, pero tiene un gran bloqueo que garantiza que solo se ejecute uno (código Python) a la vez. Esto en realidad tiene algunas ventajas.

¿No son los hilos pasados ​​de moda en estos días a favor de los procesos? (Creo que Google Chrome, IE8)

1

Hice una extensión de subprocesamiento múltiple para Lua recientemente, llamada Lua Lanes. Combina conceptos de subprocesamiento múltiple de forma tan natural con el lenguaje, que no vería que el multihilo "integrado" sea mejor.

Para el registro, a menudo se puede utilizar también el subprocesamiento múltiple cooperativo (corutinas) de Lua. Con o sin carriles.

Lanes no tiene GIL y ejecuta el código en universos Lua separados por subproceso. Por lo tanto, a menos que sus bibliotecas C se bloqueen, es inmune a los problemas asociados con el uso de subprocesos.De hecho, el concepto se parece más a los procesos y a la transmisión de mensajes, aunque solo se utiliza un proceso de SO.

+0

Últimamente, cambié a Scala, que proporciona los beneficios de Lua (código corto similar a scripting) pero con seguridad de tipo (esencial para una base de código más grande). El modelo de actor de Scala encaja perfectamente tanto en cooperativa (como en Lua nativa) como en subprocesos basados ​​en subprocesos del sistema operativo, en una sola API. – akauppi

2

Clojure es un dialecto de Lisp prometedor para la JVM que está específicamente diseñado para manejar bien la concurrencia.

Cuenta con una API de estilo funcional, algunas muy implementaciones eficientes de varias estructuras de datos inmutables, y sistema de agente (bits como actores en Scala y procesos en Erlang). Incluso tiene memoria transaccional de software.

Con todo, Clojure es muy útil para ayudarte a escribir el código correcto multiproceso y concurrente.

Cuestiones relacionadas