threads thread multi example definicion c multithreading c11

example - Soporte multi-threading en c11



processor threads (3)

Janneb ya ha dado muchas explicaciones. Para sus últimas preguntas

Por último, ¿qué compiladores proporcionan soporte para las características mencionadas anteriormente? ¿Hay alguna referencia en cuanto a los plazos cuando se admitirán?

La familia de compiladores gcc (clang, icc, opencc) soporta la mayoría de la semántica que requiere el nuevo estándar, solo existen diferencias sintácticas. (clang incluso implementa _Generic en la última versión).

Para P99 he escrito macros contenedoras que mapean la mayoría de las características a algo que ya es sintaxis C11, o se acerca (para emular _Generic ).

Entonces, si tiene uno de estos compiladores y está en un sistema POSIX, puede comenzar a usar mucho (la mayoría) de C11 inmediatamente: hilos con todos los tipos mtx_h , etc., _Atomic con _Atomic , escriba macros genéricas (la sintaxis es ligeramente diferente de C11), _Static_assert y las cosas de alineación.

El nuevo estándar C11 brinda soporte para Multi-Threading.
Mis preguntas están un poco diversificadas pero definitivamente responden.
He n1570 un vistazo al borrador C11 n1570 .
Dice:

soporte para múltiples hilos de ejecución incluyendo un modelo mejorado de secuencia de memoria, objetos atómicos y almacenamiento local de subprocesos ( <stdatomic.h> y <threads.h> )

¿Qué es el modelo de secuencia de memoria Mejorada ? ¿Cómo / qué cambia del estándar c99?

En lugar de solo citas del estándar, apreciaré si alguien profundiza en ellas e intenta explicar la semántica involucrada.

Según entiendo, C11 brinda soporte para:

  • Creación y gestión de subprocesos
  • Mutex
  • Variables condicionales
  • Thread Specific storage &
  • Objetos atómicos

Espero no haberme perdido nada?
Desde ahora, la biblioteca Standard proporciona (proporcionará) todas las funcionalidades necesarias para Multi-Threading, no habría necesidad de POSIX y tales bibliotecas (para compatibilidad con Multi-Threading) en el futuro.

Por último, ¿qué compiladores proporcionan soporte para las características mencionadas anteriormente? ¿Hay alguna referencia en cuanto a los plazos cuando se admitirán?
Recuerdo que para C ++ 11 había un enlace para las características y soporte del compilador, ¿quizás algo así?


Primero, no canceles C ++ 11. El trabajo de concurrencia para los nuevos estándares se realizó bajo el paraguas de C ++ 11, luego se importó a C11 con el objetivo explícito de ser compatible. Si bien hay algunas diferencias sintácticas (por ejemplo, debido a que el C simple no tiene plantillas o sobrecarga de funciones), semánticamente son idénticas por diseño. Para "evidencia" de esto, uno puede consultar los documentos del WG14. P.ej:

y referencias en el mismo. Se puede encontrar más en el sitio web de Open Std

Ahora, a sus preguntas:

¿Qué es el modelo de secuencia de memoria Mejorada?

La respuesta obvia es que se ha cambiado para tener en cuenta varios hilos y cómo interactúan. Para una respuesta un poco más larga, vea C ++ 11 introdujo un modelo de memoria estandarizada. Qué significa eso? ¿Y cómo afectará la programación en C ++? eso ya fue mencionado en los comentarios. Para una comprensión profunda, una respuesta de quizás no sea el lugar correcto (¡aún menos una pregunta con varias preguntas secundarias!). Pero, afortunadamente, Hans Boehm mantiene una muy buena página con enlaces interesantes para lecturas adicionales (una vez más, tenga en cuenta que los modelos de memoria C11 y C ++ 11 son semánticamente idénticos)

Espero no haberme perdido nada?

Junto con el modelo de memoria, su lista parece cubrir las adiciones de concurrencia en C11. Para otros cambios, wikipedia tiene una lista ; de la parte superior de mi cabeza no puedo encontrar nada que la lista de wikipedia haya pasado por alto.

Desde ahora, la biblioteca Standard proporciona (proporcionará) todas las funcionalidades necesarias para Multi-Threading, no habría necesidad de POSIX y tales bibliotecas (para compatibilidad con Multi-Threading) en el futuro.

Sí, habrá una necesidad para ellos. Primero, nadie va a reescribir todo el código existente que usa las diversas API de subprocesos existentes. En segundo lugar, la biblioteca de subprocesos C (++) 11 probablemente se implementará como una envoltura alrededor de las diversas librerías de hilos nativos; diablos, incluso hay una forma documentada de recuperar un puntero al subproceso nativo subyacente, en caso de que uno necesite hacer algo más allá de lo que admite la biblioteca de subprocesos C (++). Piense en la biblioteca de subprocesos C (++) 11 como una envoltura portátil, de denominador mínimo común alrededor de las distintas bibliotecas de subprocesos nativos.

Por último, ¿qué compiladores proporcionan soporte para las características mencionadas anteriormente? ¿Hay alguna referencia en cuanto a los plazos cuando se admitirán? Recuerdo que para C ++ 11 había un enlace para las características y soporte del compilador, ¿quizás algo así?

No he visto ninguna lista detallada, no parece haber tanto ruido alrededor de C11 en comparación con C ++ 11. Hay un breve aviso para el próximo GCC 4.7 aquí: http://gcc.gnu.org/gcc-4.7/changes.html . Para el soporte de simultaneidad, se puede consultar el soporte para la concurrencia en la página de estado de C ++ 11 aquí: http://gcc.gnu.org/projects/cxx0x.html . También hay algunas notas sobre el estado actual y los planes para GCC en http://gcc.gnu.org/wiki/Atomic (según esa página, stdatomic.h está disponible). Para otros compiladores, hay una buena lista del estado de C ++ 11 para varios compiladores aquí http://www.aristeia.com/C++11/C++11FeatureAvailability.htm . Desde los enlaces, uno puede verificar el estado del soporte de simultaneidad y, suponiendo que el proveedor en cuestión planee soportar C11, es probable que el soporte de simultaneidad C11 tenga aproximadamente el mismo nivel.


Respecto a What compilers provide support for the above mentioned features?

Pelles C es compatible con C11 <threads.h> . Creación de hilos con el ejemplo del compilador de Pelles C :

#include <stdio.h> #include <threads.h> #define NUM_THREADS 7 static int threadData[NUM_THREADS]; int threadFunction(void * data) { printf("%d-th thread up/n", *(int*)data); return 0; } int main(void) { thrd_t threadId[NUM_THREADS]; // init thread data for (int i=0; i < NUM_THREADS; ++i) threadData[i] = i; // start NUM_THREADS amount of threads for (int i=0; i < NUM_THREADS; ++i) { if (thrd_create(threadId+i, threadFunction, threadData+i) != thrd_success) { printf("%d-th thread create error/n", i); return 0; } } // wait until all threads terminates for (int i=0; i < NUM_THREADS; ++i) thrd_join(threadId[i], NULL); return 0; }

EDITAR : eliminó el problema de los datos compartidos de la secuencia y el problema de salir de main() antes de que todos los hilos finalicen.