C11 GCC subprocesos.h no encontrado?

4 minutos de lectura

avatar de usuario
lucasarte

El siguiente código

#include <threads.h>

me da este error:

fatal error: threads.h: No such file or directory

Usando el último GCC y Clang con -std=c11.

¿GCC y Clang no admiten subprocesos C11? ¿O hay un truco (o algo para instalar) para obtenerlo? Solo estoy usando Ubuntu 14.04 con los paquetes gcc y clang del repositorio de Ubuntu.

  • El número de compiladores que admiten completamente c11 y/o threads.h es negativo. 🙁

    – esta

    5 de abril de 2014 a las 1:34

  • Los subprocesos C11, cuando finalmente se admitan, serán compatibles con C Biblioteca y no el compilador propiamente dicho. Al menos dos personas están hablando de implementar subprocesos C11 para glibc como un proyecto GSoC este verano. Mientras tanto, es posible que encuentre el pthread.h API sospechosamente similar, aunque con nombres mucho más largos para todo.

    – zwol

    5 de abril de 2014 a las 1:40


  • Gran parte de la estandarización está “bendiciendo” las extensiones existentes ampliamente implementadas que se consideran una buena idea, pero la experiencia muestra que el tiempo de espera entre una nueva función que aparece en el estándar C y que los compiladores/bibliotecas la implementan ampliamente es más como “10 años a nunca” que “hasta 3 años”.

    – Emmet

    5 de abril de 2014 a las 1:58

  • @Hormiga /yo desliza sin decir palabra la botella de whisky por la barra hacia ti

    – zwol

    5 de abril de 2014 a las 2:14


  • Consulte también ¿Alguna biblioteca C implementa subprocesos C11 para GNU/Linux?

    –Keith Thompson

    8 de enero de 2016 a las 1:49

avatar de usuario
Shafik Yaghmour

los gcc documento estado C11 indica que no soporta threading, dice:

enhebrar [Optional] | Problema de biblioteca (no implementado)

Como indica el documento, esto no es realmente un gcc o clang problema pero glibc asunto. Como señaló Zack, parece puede haber trabajo en marcha pronto obtener apoyo para esto en glibc pero eso no te ayudará ahora. Puedes usar esta mientras tanto.

Corregido para glibc 2.28

Según el Error 14092 – Compatibilidad con subprocesos C11 esto está arreglado en glibc 2.28:

Implementado aguas arriba por:

9d0a979 Agregar documentación manual para hilos.h
0a07288 nptl: agregar casos de prueba para subprocesos ISO C11
c6dd669 nptl: agregue símbolos de lista de habilidades para subprocesos C11
78d4013 nptl: Añadir subprocesos C11 funciones tss_*
918311a nptl: Agregar subprocesos C11 cnd_* funciones
3c20a67 nptl: Agregar subprocesos C11 funciones call_once
18d59c1 nptl: Añadir subprocesos C11 funciones mtx_*
ce7528f nptl: Agregar subprocesos C11 funciones thrd_*

Se incluirá en 2.28.

  • Gracias. Entonces, ¿ni GCC ni Clang son compatibles con subprocesos C11? Entonces tendré que regresar a los hilos POSIX 🙁

    – lucasarte

    5 de abril de 2014 a las 1:50

  • @lucasart parece ser el caso

    – Shafik Yaghmour

    5 de abril de 2014 a las 1:55

  • Ojalá hubiera leído esto ayer. El Bugzilla para enhebrar glibc todavía está abierto (más de 2 años). @lucasart: los hilos POSIX no parecen una regresión; interfaz casi idéntica, “portátil”, y implementado. 🙂 De hecho, compilando contra glibc 2.19 informes __STDC_NO_THREADS__ es 1. Ver también este SO para enlaces adicionales. pthreads es (o C++ 11 std::threadque por cierto depende de -pthread…).

    – hoc_edad

    2 de julio de 2014 a las 15:17

  • Aparentemente algún movimiento en el lado glibc

    – Shafik Yaghmour

    29/06/2015 a las 14:30

  • yo puedo #include <threads.h> ahora con Glibc 2.31 (Ubuntu 20.04)

    – Antti Haapala — Слава Україні

    17 de enero de 2021 a las 10:05


avatar de usuario
usuario2548688

Musulmán apoyo C11 <threads.h>.

En la instalación de Debian musl-toolsy luego compilar con musl-gcc. Estoy trabajando en arrancar Debian con Musl en lugar de Glibc.

Ver también esta.

  • En Ubuntu el encabezado vinculado c11hilos.h provoca un montón de errores. P.ej PTHREAD_MUTEX_TIMED_NP siendo no declarado. La búsqueda dice que debería estar en el incluido pthreads.hpero parece que no lo es.

    – Hola angel

    6 de julio de 2015 a las 4:47

  • @Hi-Angel Debe usar el indicador del compilador -std=gnu11 en lugar de -std=c11 o necesita usar un #define _GNU_SOURCE antes de incluir ese archivo c11threads.h.

    – nos

    15 de enero de 2016 a las 10:29


  • Funciona en debian 9.13 domingo 28 de febrero de 2021.

    – zkutch

    28 de febrero de 2021 a las 4:49

avatar de usuario
jeff hammond

Si bien los subprocesos C11 aún no se han implementado, se han implementado subprocesos C++ 11 y tienen una funcionalidad similar. Por supuesto, C++ 11 puede ser una solución inaceptable, en cuyo caso los comentarios anteriores sobre los subprocesos POSIX son su mejor esperanza.

Los subprocesos se han fusionado con la línea principal Glibc y están disponibles, por ejemplo, en mi Ubuntu 20.04. Desafortunadamente, parece que no tengo ninguna página de manual para la función. Pero esto funciona:

#include <threads.h>
#include <stdio.h>

int hello_from_threading(void *arg) {
    printf("Thread about to take a nap...\n");
    thrd_sleep(&(struct timespec) { .tv_sec = 3 }, NULL);
    printf("Woke up from 3 second slumber\n");
    return 42;
}

int main(void) {
    thrd_t thread;
    thrd_create(&thread, hello_from_threading, NULL);
    int res;
    printf("A thread was started\n");
    thrd_join(thread, &res);
    printf("Thread ended, returning %d\n", res);
}

y probándolo:

% gcc threading.c -o threading -lpthread
% ./threading
A thread was started
Thread about to take a nap...
Woke up from 3 second slumber
Thread ended, returning 42

¿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