我正在尝试使用 编译一些 C11 代码thread.h
,但我不能。我已经重新编译了 GCC(现在运行 4.6.2),我正在尝试使用gcc -std=c1x file.c -o file
. 我可以在 g++ 中执行此操作(thread
即使用库),但我不能在 C中执行此操作thread.h
。GCC 发行版中还没有包含此功能吗?
4 回答
用于螺纹的标准 C11 接头是<threads.h>
,不是<thread.h>
。见N1570 草案第 7.26 节。
大多数 C 标准库,例如 stdio,不包含在 gcc 发行版中。相反,gcc 依赖于操作系统提供的任何运行时库。这通常包括标题(如<threads.h>
)和实现库的实际代码。
对于大多数 Linux 系统(或 GNU/Linux,如果您愿意),库是 GNU 的 glibc;对于其他系统,它将是另一回事。
所以真正的问题可能是 glibc 或您使用的任何 C 库何时支持 C11 的线程特性。
glibc 在 2.28 版本中增加了对 C11 线程的支持。Ubuntu 18.04.1 LTS 系统目前仍然使用 glibc 2.27。同样,这仅适用于使用 GNU libc 的实现,而不适用于所有基于 gcc 的实现。WorldSEnder 在评论中提到。
更新:Ubuntu 18.10(不是 LTS(长期支持)版本)有 glibc 2.28,它支持<threads.h>
. 此外,正如user2548688 的回答所指出的,musl C 库支持<threads.h>
. 在 Ubuntu 上,您可以安装该musl-dev
软件包并使用该musl-gcc
命令。
(请注意,与编译器最密切相关的库的一些部分是由 gcc 本身提供的。线程库可能不是其中之一,但肯定需要一些编译器支持。)
可以在此处找到有关此的更多信息。
...(Atomics - stdatomic.h - 是可选的,可能需要等待相关语言功能在 GCC 4.8 中实现。我猜threads.h 中的可选线程接口和附件中的边界检查接口Glibc 目前不需要 K,尽管它们可能会进入单独的库中。
我的猜测是我们在很长一段时间内都不会看到这个实现,至少不会在标准 glibc 和 gcc 中实现(来源帖子提供了一些见解)。我个人的猜测是大约一年,可能需要大约 2 年,直到它足够稳定以供生产使用。那是 2k14(断言(survival_2012)):P
引用关于 C11的 GCC标准页面:
GCC 对本标准的部分内容提供有限的不完全支持
虽然我只有 GCC 4.6.1,但我的系统上的任何地方都没有“thread.h”头文件。
4.7 更改页面中提到了“线程”,但在 C11 上下文中似乎与它没有任何关系。此外,即将发布的4.8页面中没有提及 C11 。
musl libc 有 C11 http://www.musl-libc.org/ glibc 还不支持threads.h