clang c11 threads.h未找到。

12
我正在尝试在Xcode中设置c11线程示例...但似乎没有threads.h头文件,虽然它没有抱怨此处描述的宏:
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf

__STDC_NO_THREADS__这个整数常量为1,旨在表示该实现不支持<threads.h>头文件。

显示方言 显示错误


1
似乎找不到threads.h文件。 - Robert Harvey
1
这对我来说也是这样的 :) 如果__STDC_NO_THREADS__宏不为1,则应该是C11标准库的一部分 - Grady Player
我猜你应该检查一下那个文件夹,看看 threads.h 是否在里面,如果在的话,再看看编译器是否可以访问它。 - Robert Harvey
似乎不在Xcode包中...根据命令find /Applications/Xcode.app/Contents -name threads.h - Grady Player
1
请尝试 #if !defined(__STDC_NO_THREADS) || __STDC_NO_THREADS__ - Kevin
@Kevin,我们来看看...应该有一个神奇的__ALL_MACROS__宏...或者已经有了...思路被打乱了。 - Grady Player
5个回答

3

看起来C11几乎没有支持线程特性的东西...也许我会尝试把它加入到clang中...


如果你愿意在不同的C库上构建,那可能会更简单。我最近研究了musl(http://www.musl-libc.org/),在那里这样的任务似乎是可行的。如果你满意使用POSIX的包装器,我的P99(p99.gforge.inria.fr)就足够了。 - Jens Gustedt
我从未看过任何替代品(现在我会)......最终它需要在glibc / gcc / clang中运行......如果它只是对支持的posix线程的包装器......那么我认为这就足够了。 - Grady Player
threads.h现在可以在Linux(自glibc 2.28,musl 1.1.5)和FreeBSD上使用(链接时需加上-lstdthreads)。但是在macOS或Windows上仍然没有主流支持。但是现在它已经在Linux和FreeBSD上得到支持,因此macOS和Windows加入C11线程的可能性更高了。实际上,Windows上的Pelles C编译器已经支持它,但我不会将其视为“主流支持”(这将是MSVC和/或MinGW-w64)。 - Simon Kissane
@simonKissane,至少现在定义了__STDC_NO_THREADS__...所以我猜它至少是符合标准的。 - Grady Player

2

如果有人在2021年及以后查找此信息,需要注意苹果仍不支持此功能,而且可能永远不会支持。正如其他人所说,pthreads是最佳选择。需要注意的是,广泛使用的C11线程并不受支持。我敢说,在大多数情况下,pthreads更具可移植性。

从开发角度来看,C11线程太过有限,并且混淆了用户空间与内核空间实现特性以及实现属性。

如果您真的需要C11线程,我建议您采取以下三种方法之一。

  1. 不要使用。
  2. 使用跨平台库:https://github.com/tinycthread/tinycthread 似乎做得很好。
  3. 编写自己的polyfill。我刚提到的库尝试支持一些平台(虽然现在已经不活跃了),但是任何有一点pthread和win32线程经验的人都可以轻松(但也许会头疼)地编写polyfill。 几天前,出于兴趣,我确实这样做了,只用了几百行代码,还不错。 对于任何将大量使用它的项目,这将更加控制使用。

需要注意的是,一些其他C11功能在OSX上得到支持,例如C11原子操作,如果没有大量ASM知识,这是不可能实现的。


1
是的...委员会在2011年才发布线程支持并期望它能够被实现,这是很天真的想法,因为像pthread这样的事实标准已经在10多年前确立。我不知道他们为什么没有将pthread作为标准C库,但我非常怀疑原因与技术无关,更可能与政治和声望有关。 - Lundin
@Lundin 是的。C标准一直以来都有意地限制在很小的范围内。开发进展缓慢,功能/库的增加很少,兼容性是委员会的主要关注点。 - undefined

1

在我的机器上使用clang(版本为3.2,运行在ubuntu/linux系统上),该特性测试宏未定义。对于该特性的支持需要C库的支持,而通常不会随编译器一起提供。因此,对于clang来说,答案与gcc并没有太大区别,它们通常都基于相同的C库构建,即glibc,请参见这里gcc的答案


0
尽管没有抱怨,但似乎缺少threads.h头文件。 C11有两个关于__STDC_NO_THREADS__的规范。
实现定义宏__STDC_NO_THREADS__的不需要提供此头文件或支持其任何功能。C11 N1570 §7.26.1 2 __STDC_NO_THREADS__整数常量1,旨在指示实现不支持<threads.h>头文件。C11 N1570 §6.10.8.3 1
根据§7.26.1 2:
#ifdef __STDC_NO_THREADS__
#error "No threading support"
#else
#include <threads.h>
#endif

根据§6.10.8.3:
#if defined(__STDC_NO_THREADS) && __STDC_NO_THREADS__ == 1
#error "No threading support"
#else
#include <threads.h>
#endif

// Certainly this can be simplified to
#if defined(__STDC_NO_THREADS) && __STDC_NO_THREADS__

或者每个在#if中使用未定义常量的值是多少?

#if __STDC_NO_THREADS__

这与 OP 的代码匹配,因此我本来期望它能够在符合 C11 标准的编译器上工作。


看起来OP有一个解决方案针对@Kevin。但这可能是一个错误的解决方案,因为__STDC_NO_THREADS看起来像是一个打字错误(缺少尾随__)。

#if !defined(__STDC_NO_THREADS) || __STDC_NO_THREADS__

-19
在C++11中,你需要#include <thread>而不是threads.h
#include <iostream>
#include <thread>

void fun() { std::cout << "fun!" << std::endl; }

int main() {
    std::thread t ( fun );
    t.join ();
    return 0;
}

4
是的,这个问题特别关注不太被炒作的C11。 - Grady Player

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