GCC中是否支持C11 <thread.h>?

30

我正在尝试使用thread.h编译一些C11代码,但无法成功。 我已重新编译了GCC(现在运行的是4.6.2版本),并尝试使用gcc -std=c1x file.c -o file进行编译。 在g ++中,我可以做到这一点(使用thread库),但在C中无法实现。 thread.h是否还没有包含在GCC发行版中?


可能是Does any C library implement C11 threads for GNU/Linux?的重复问题。 - Ciro Santilli OurBigBook.com
对于任何相对较新的gcc版本,您可以使用“-std=c11”而不是“-std=c1x”。 - Keith Thompson
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(长期支持)版本)具有支持<threads.h>的glibc 2.28。另外,正如user2548688的回答指出的那样,musl C库支持<threads.h>。在Ubuntu上,您可以安装musl-dev包并使用musl-gcc命令。

请注意,库中的一些部分,尤其是与编译器密切相关的部分,gcc本身提供。线程库 可能不是其中之一,但肯定需要一些编译器支持。


1
大多数Linux系统使用glibc,一些(如现代Debian及其衍生版本)使用EGLIBC。还有一些其他系统使用其他替代品。 - SO Stinks
1
现代Debian使用EGLIBC。需要澄清的是,Debian及其衍生版本在6和7版本(约2009-2015年)中使用eglibc,但在Debian 8中切换到了glibc。截至2020年初(Debian 10),Debian仍然使用glibc。原始评论发布于2013年,因此当时是正确的。 - asky

9

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

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

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


1
2014年8月27日(两年七个月后):还没有在GLIBC中开发“threads.h”的计划。 - Peque
是的,不幸的是我错了(因此原生的Windows线程/ POSIX线程在可预见的未来必须使用)。 由于某种原因,没有人推动支持可移植线程:/ - Tomas Pruzina
1
glibc 2.28,2018年8月(在我的回答中提到)。 - Keith Thompson

6

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

GCC对该标准的部分支持是有限且不完整的。

虽然我只有GCC 4.6.1,但是我在系统中找不到任何“thread.h”头文件。

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


在4.7版本更新页面中提到了“线程”,但似乎与C11上下文无关。另外,在即将发布的4.8页面中也没有提到C11。

4
这并不完全正确:4.7版确实提到了线程。我不确定您发布时是否有提到,但现在肯定有了。 - Levi Morrison

2

glibc 2.28,2018年8月(我在回答中提到的)。 - Keith Thompson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接