29

我正在尝试使用 编译一些 C11 代码thread.h,但我不能。我已经重新编译了 GCC(现在运行 4.6.2),我正在尝试使用gcc -std=c1x file.c -o file. 我可以在 g++ 中执行此操作(thread即使用库),但我不能在 C中执行此操作thread.h。GCC 发行版中还没有包含此功能吗?

4

4 回答 4

42

用于螺纹的标准 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 本身提供的。线程库可能不是其中之一,但肯定需要一些编译器支持。)

于 2012-01-14T04:15:25.213 回答
9

可以在此处找到有关此的更多信息。

...(Atomics - stdatomic.h - 是可选的,可能需要等待相关语言功能在 GCC 4.8 中实现。我猜threads.h 中的可选线程接口和附件中的边界检查接口Glibc 目前不需要 K,尽管它们可能会进入单独的库中。

我的猜测是我们在很长一段时间内都不会看到这个实现,至少不会在标准 glibc 和 gcc 中实现(来源帖子提供了一些见解)。我个人的猜测是大约一年,可能需要大约 2 年,直到它足够稳定以供生产使用。那是 2k14(断言(survival_2012)):P

于 2012-01-22T19:42:39.773 回答
6

引用关于 C11的 GCC标准页面:

GCC 对本标准的部分内容提供有限的不完全支持

虽然我只有 GCC 4.6.1,但我的系统上的任何地方都没有“thread.h”头文件。

4.64.7的更改页面都没有提到线程。


4.7 更改页面中提到了“线程”,但在 C11 上下文中似乎与它没有任何关系。此外,即将发布的4.8页面中没有提及 C11 。

于 2012-01-14T01:47:10.327 回答
2

musl libc 有 C11 http://www.musl-libc.org/ glibc 还不支持threads.h

于 2015-02-12T15:06:04.243 回答