C11 <thread.h> в GCC?

Я пытаюсь скомпилировать код C11 с помощью thread.h, но я не могу. Я перекомпилировал GCC (теперь работает 4.6.2), а Im пытается скомпилировать с помощью gcc -std=c1x file.c -o file. Я могу сделать это в g++ (используя библиотеку thread, то есть), но я не могу на C. Является thread.h еще не включенным в GCC-дистрибутив?

Ответ 1

Стандартный заголовок C11 для потоков - это <threads.h>, а не <thread.h>. См. Раздел 7.26 черновика N1570.

Большая часть стандартной библиотеки C, включая, например, stdio, не включена в дистрибутив gcc. Вместо этого gcc зависит от того, какая библиотека времени выполнения предоставлена операционной системой. Обычно это включает как заголовки (например, <threads.h>), так и реальный код, реализующий библиотеку.

Для большинства систем Linux (или, если хотите, GNU/Linux), библиотека называется GNU glibc; для других систем это будет что-то другое.

Таким образом, реальный вопрос, вероятно, заключается в том, когда glibc, или какая библиотека C вы используете, будет поддерживать функции потоков C11.

В glibc добавлена поддержка потоков C11 в версии 2.28. Система Ubuntu 18.04.1 LTS в настоящее время все еще использует glibc 2.27. Опять же, это относится только к реализациям, использующим GNU libc, а не ко всем реализациям на основе gcc. Упоминается WorldSEnder в комментарии.

ОБНОВЛЕНИЕ: Ubuntu 18.10 (не версия LTS (Long Term Support)) имеет glibc 2.28, который поддерживает <threads.h>. Кроме того, как указывает ответ user2548688, библиотека musl C поддерживает <threads.h>. В Ubuntu вы можете установить пакет musl-dev и использовать команду musl-gcc.

(Обратите внимание, что некоторые части библиотеки, наиболее тесно связанные с компилятором, предоставляются самим gcc. Вероятно, библиотека потоков не является одной из них, но, безусловно, требуется некоторая поддержка компилятора.)

Ответ 2

Дополнительную информацию об этом можно найти здесь.

... (Atomics - stdatomic.h - являются необязательными, и, вероятно, придется ждать связанные функции языка, которые будут реализованы в GCC 4.8. Я бы предположил, что опциональные потоковые интерфейсы в threads.h и проверка границ интерфейсы в Приложении K пока не нужны для glibc, хотя они могут потенциально попадают в отдельные библиотеки.

Моя догадка заключается в том, что мы не увидим, что это реализовано довольно долгое время, по крайней мере, не в стандартных glibc и gcc (статья с источниками данных дает некоторое представление). Моя личная догадка - это что-то вроде одного года, это займет примерно 2 года, пока она не станет достаточно стабильной для производства. Thats 2k14 (assert (survival_2012)): P

Ответ 3

Процитировать на странице стандартов GCC о C11:

GCC ограничивает неполную поддержку частей этого стандарта

Пока у меня только GCC 4.6.1, у меня нет файла заголовка "thread.h" в любой точке моей системы.

Ни страницы изменений для 4.6, ни 4.7 упоминает темы.


На странице изменений 4.7 есть "потоки", но ничего похожего на это в контексте C11. Кроме того, ничего о C11 не упоминается на странице 4.8.