C11 <thread.h> в GCC? - PullRequest
       51

C11 <thread.h> в GCC?

28 голосов
/ 14 января 2012

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

Ответы [ 4 ]

40 голосов
/ 14 января 2012

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

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

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

Таким образом, реальный вопрос, вероятно, заключается в том, когда 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. Библиотека потоков , вероятно, не является одной из них, но, безусловно, требуется некоторая поддержка компилятора.)

9 голосов
/ 22 января 2012

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

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

Я предполагаю, что мы не увидим, что это будет реализовано в течение достаточно долгого времени, по крайней мере, не в стандартных glibc и gcc (исходные сообщения дают некоторое представление). Мое личное предположение примерно год, вероятно, потребуется около двух лет, пока он не станет достаточно стабильным для производственного использования. То 2к14 (утверждают (вырождение_2012)): P

6 голосов
/ 14 января 2012

Цитировать со страницы стандартов GCC о C11:

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

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

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


На странице изменений 4.7 упоминаются «темы», но, похоже, они не имеют ничего общего с контекстом C11.Кроме того, ничего о C11 не упоминается на следующей странице 4.8 .

2 голосов
/ 12 февраля 2015

musl libc имеет C11 http://www.musl -libc.org / glibc пока не поддерживает threads.h

...