Compatibilidad con subprocesos múltiples en c11

10 minutos de lectura

Compatibilidad con subprocesos multiples en c11
Guardar

El nuevo estándar C11 proporciona soporte para Multi-Threading.
Mis preguntas son un poco diversificadas pero definitivamente respondibles.
He echado un vistazo al C11. n1570 sequía.
Dice:

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

Cuál es el Modelo de secuenciación de memoria mejorado? ¿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 tengo entendido, C11 proporciona soporte para:

  • Creación y gestión de hilos
  • exclusión mutua
  • Variables condicionales
  • Almacenamiento específico de hilos y
  • Objetos atómicos

Espero no haberme perdido nada?
Dado que ahora la biblioteca estándar en sí proporciona (proporcionará) todas las funcionalidades necesarias para subprocesos múltiples, ¿no habría necesidad de POSIX y tales bibliotecas (para compatibilidad con subprocesos múltiples) en el futuro?

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

  • Ver también: stackoverflow.com/questions/4938258/…

    – bdonlan

    16 de enero de 2012 a las 6:17

  • @bdonlan: La pregunta es sobre c11 y no sobre c++ 11. Ambos son diferentes. Los dos enlaces que proporcionaste son para c++ 11 y no sobre c11.

    – Alok Guardar

    16 de enero de 2012 a las 6:19


  • Estoy votando cerca (‘duplicado exacto’) porque su primera pregunta (Sobre el modelo de secuenciación) ya ha sido respondida. Es difícil responder preguntas que contienen varias preguntas, porque es posible que alguien solo conozca una parte de su pregunta; por lo tanto, su respuesta nunca se puede aceptar, porque no responde a la pregunta completa y es posible que nunca haya una respuesta aceptada. Divida su pregunta y elimine la parte duplicada exacta (o indique por qué es diferente de las preguntas que vinculé).

    – bdonlan

    16 de enero de 2012 a las 6:25

  • … oh, ahora veo que se trata de C11, no de C++11. ¡Olvidalo entonces! Sin embargo, aún recomiendo que divida su pregunta: tiene una pregunta sobre 1) ¿Qué es un modelo de secuenciación de memoria? (posiblemente respondido por el de C++ 11, la respuesta será similar con una sintaxis diferente) 2) ¿ES esto todo lo que proporciona C11? 3) ¿Todavía se necesitan pthreads, etc.? 4) ¿Cómo está progresando el soporte del compilador C11?

    – bdonlan

    16 de enero de 2012 a las 6:25


  • @bdonlan: Yo creo 1-3 Las Q están relacionadas lógicamente y deben agruparse. Una respuesta para cualquiera de las 3 tocaría las 3. Tal vez, 4 podría ser una Q separada, pero no me sentí justificado al comenzar una Q solo por eso.

    – Alok Guardar

    16 de enero de 2012 a las 6:31


Compatibilidad con subprocesos multiples en c11
janneb

Primero, no descarte C++11. El trabajo de concurrencia para los nuevos estándares se realizó bajo el paraguas de C++11 y 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 C simple no tiene plantillas o sobrecarga de funciones), semánticamente son idénticas por diseño. Para obtener “pruebas” de esto, se pueden consultar los documentos del WG14. P.ej:

y referencias en el mismo. Se puede encontrar más en
Abrir sitio web estándar

Ahora, vamos a tus preguntas:

¿Qué es el modelo de secuenciación de memoria mejorada?

La respuesta obvia es que se ha cambiado para tener en cuenta varios subprocesos y cómo interactúan. Para obtener una respuesta un poco más larga, consulte C++ 11 introdujo un modelo de memoria estandarizado. ¿Qué significa? ¿Y cómo afectará a la programación en C++? eso ya fue mencionado en los comentarios. Para una comprensión profunda, una respuesta de stackoverflow quizás no sea el lugar correcto (¡mucho menos una pregunta con varias subpreguntas!). Pero por suerte Hans Boehm mantiene una página muy buena con enlaces interesantes para leer más (nuevamente, 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.

Dado que ahora la biblioteca estándar en sí proporciona (proporcionará) todas las funcionalidades necesarias para subprocesos múltiples, ¿no habría necesidad de POSIX y tales bibliotecas (para compatibilidad con subprocesos múltiples) en el futuro?

Sí, habrá una necesidad de ellos. En primer lugar, nadie va a reescribir todo el código existente que utiliza las diversas API de subprocesos existentes. En segundo lugar, la biblioteca de subprocesos de C(++)11 es/lo más probable es que se implemente como un envoltorio alrededor de las diversas bibliotecas de subprocesos 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 más como un contenedor de mínimo común denominador portátil alrededor de las diversas bibliotecas de subprocesos nativos.

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

No he visto ninguna lista detallada, no parece haber tanto revuelo en torno a 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/cambios.html . Para el soporte de concurrencia, se puede comprobar el soporte de concurrencia en la página de estado de C++11 aquí: http://gcc.gnu.org/proyectos/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 allí, se puede verificar el estado del soporte de concurrencia y, suponiendo que el proveedor en cuestión planea admitir C11, es probable que el soporte de concurrencia de C11 esté aproximadamente al mismo nivel.

  • ¡Gracias! Algunos comentarios, no estoy del todo convencido por el argumento de que la concurrencia en c11 está inspirada o importada de C++ 11. Cualquier referencia creíble que lo diga aumentará mi fe para aceptarlo. Acerca de la necesidad de bibliotecas POSIX y Multithreading en el futuro, un usuario no tendrá que molestarse en asegurarse de tenerlos en su lugar porque el estándar ahora exige que una implementación debe tenerlos en su lugar. Entonces, incluso si la API de biblioteca estándar es solo un contenedor sobre las bibliotecas nativas, es responsabilidad de la implementación proporcionar todo paquete a diferencia de antes. Sin embargo, buenos enlaces en el soporte del compilador.

    – Alok Guardar

    17 de enero de 2012 a las 5:22

  • @Als: agregué algunos enlaces sobre la herencia de C++ del trabajo de concurrencia. Escriba su segundo punto, tenga en cuenta que 1) pasará mucho tiempo hasta que C11 sea lo suficientemente común como para asumir que está disponible 2) aun así, los subprocesos y los átomos son una parte opcional del estándar, consulte, por ejemplo, el Macros __STDC_NO_THREADS__ y __STDC_NO_ATOMICS__. Dicho esto, en mi humilde opinión, el modelo de memoria es un gran paso adelante, ya que especifica cómo debe comportarse el compilador con los accesos a la memoria por múltiples subprocesos, lo que ayuda a los programas que usan pthreads tan bien como aquellos que usan los subprocesos C11.

    – janneb

    17 de enero de 2012 a las 8:28


  • @Als: Se agregó un enlace más (n1349). Además, perdón por el error de formato en el comentario anterior.

    – janneb

    17 de enero de 2012 a las 9:39

  • ¿Existe alguna forma estándar de solicitar una barrera de “acceso a la memoria del compilador” que requiera un compilador para garantizar que todas las escrituras pendientes se envíen a la plataforma subyacente antes de que la ejecución pase la barrera, y todas las lecturas examinen un valor que existió en algún momento después de la barrera? Muchas plataformas tienen varios compiladores disponibles, y sería útil que un programa escrito para una plataforma en particular pudiera ejecutarse de manera confiable en todos los compiladores de esa plataforma, y ​​la idea de crear una barrera de secuenciación de memoria del compilador no parece oscura.

    – Super gato

    12 mayo 2016 a las 22:30


  • A partir de Visual Studio 2017, hay un encabezado llamado xthreads.h (lo encontrarás debajo de thr carpeta en el directorio de inclusión). Es casi idéntico a threads.h. Pero creo que esto solo se creó para admitir la implementación de subprocesos de C ++. Aún así, funciona bien.

    – molesto_calamar

    21 de febrero de 2019 a las 14:08


Compatibilidad con subprocesos multiples en c11
Agnius Vasiliauskas

Con respecto a What compilers provide support for the above mentioned features?


Pelles C apoya C11 <threads.h>. Creación de hilos con Pelles C ejemplo de compilador:

#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: Se eliminó el problema de datos compartidos del subproceso y el problema de salir de main() antes de que terminen todos los subprocesos.

1647583813 56 Compatibilidad con subprocesos multiples en c11
Jens Gustedt

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

Por último, ¿qué compiladores brindan soporte para las funciones mencionadas anteriormente? ¿Hay referencias en cuanto a los plazos en los que se admitirán?

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

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

Así que si tienes uno de estos compiladores y están en un sistema POSIX, puede comenzar a usar mucho (la mayoría) de C11 inmediatamente: subprocesos con todos los tipos mtx_h etc, atómicos con _Atomicescriba macros genéricas (la sintaxis es ligeramente diferente de C11), _Static_assert y las cosas de alineación.

  • “threads.h” en mi humilde opinión va a ser parte de las bibliotecas C (como glibc) no solo del compilador. Ninguna biblioteca y compilador de C actual tiene soporte completo para subprocesos múltiples “verdaderos” (por ahora y en un futuro cercano a partir del 02/2k12).

    – Tomás Pruzina

    4 de febrero de 2012 a las 15:31

  • @AoeAoe, P99 también contiene una emulación completa de la parte “threads.h” sobre los hilos POSIX, que incluye mtx_t, cond_t Y cosas como esa.

    – Jens Gusted

    4 de febrero de 2012 a las 16:19

  • ¿Qué define a la “familia gcc”? No hay relación que yo sepa entre el compilador GNU C, el compilador Intel C y Clang.

    – bames53

    29/10/2012 a las 15:55

  • @ bames53, existe la relación simple de que estos compiladores parecen intentar ser en gran parte compatibles con gcc. En particular, todos definen la __GNUC__ macro a algún valor.

    – Jens Gusted

    29/10/2012 a las 16:01

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad