我正在尝试在 xcode 中设置一个 c11 线程示例...但它似乎没有threads.h 标头,尽管它并不抱怨此处描述的宏:
http://www.open-std。 org/jtc1/sc22/wg14/www/docs/n1570.pdf
__STDC_NO_THREADS__整数常量1,意在表示实现不支持<threads.h>头。
看起来几乎没有东西支持 C11 中的线程功能......也许我会尝试将它融入到 clang 中......
在我的机器上(ubuntu/linux 上的 v. 3.2)没有定义功能测试宏。对该功能的支持需要 C 库中的支持,而编译器通常不提供该支持。所以基本上 clang 的答案与 gcc 的答案没有太大不同,它们通常建立在同一个 C 库上,即 glibc,请参阅此处以获取 gcc 的答案。
以防万一有人在 2021+ 年查找此功能,Apple 仍然不支持此功能,而且可能永远不会支持。正如其他人所说,pthreads
这是迄今为止最好的选择。请注意,广泛地不支持 C11 线程。我会说pthreads
在大多数情况下更便携。
从开发的角度来看,C11 线程太有限了,并且混淆了用户空间与内核空间的实现特性以及实现属性。
如果你真的需要 C11 线程,我建议你做三件事之一。
值得一提的是,OSX 还支持其他一些 C11 功能,例如 C11 Atomics,如果没有大量 ASM 知识,就无法对其进行补充。
它似乎没有
threads.h
标题,尽管它没有抱怨
C11 有 2 个规格__STDC_NO_THREADS__
7.26 线程
定义宏的实现__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 __STDC_NO_THREADS__
这与 OP 的代码相匹配,所以我希望它可以与兼容的 C11 编译器一起使用。
然而,看起来 OP每个@Kevin都有一个解决方案。这可能是一个错误的解决方案,因为 看起来像是一个错字(缺少尾随)。__STDC_NO_THREADS
__
#if !defined(__STDC_NO_THREADS) || __STDC_NO_THREADS__
在 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;
}