10

我正在尝试在 xcode 中设置一个 c11 线程示例...但它似乎没有threads.h 标头,尽管它并不抱怨此处描述的宏:
http://www.open-std。 org/jtc1/sc22/wg14/www/docs/n1570.pdf

__STDC_NO_THREADS__整数常量1,意在表示实现不支持<threads.h>头。

显示方言 显示错误

4

5 回答 5

3

看起来几乎没有东西支持 C11 中的线程功能......也许我会尝试将它融入到 clang 中......

于 2013-04-26T21:28:38.423 回答
1

在我的机器上(ubuntu/linux 上的 v. 3.2)没有定义功能测试宏。对该功能的支持需要 C 库中的支持,而编译器通常不提供该支持。所以基本上 clang 的答案与 gcc 的答案没有太大不同,它们通常建立在同一个 C 库上,即 glibc,请参阅此处以获取 gcc 的答案

于 2013-04-26T21:34:00.417 回答
0

以防万一有人在 2021+ 年查找此功能,Apple 仍然不支持此功能,而且可能永远不会支持。正如其他人所说,pthreads这是迄今为止最好的选择。请注意,广泛地不支持 C11 线程。我会说pthreads在大多数情况下更便携。

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

如果你真的需要 C11 线程,我建议你做三件事之一。

  1. 不。
  2. 使用跨平台库:https ://github.com/tinycthread/tinycthread似乎做得很好。
  3. 编写你自己的 polyfill。我刚才提到的库试图支持一堆平台(虽然它现在不活动),但是任何对 pthreads 和 win32 线程有一点经验的人都不会遇到任何问题(但是,可能会让人头疼)编写一个 polyfill。前几天我实际上是出于兴趣而这样做的,它只花了几百行,还不错。对于将大量使用它的任何项目,这将给予对使用的更多控制。

值得一提的是,OSX 还支持其他一些 C11 功能,例如 C11 Atomics,如果没有大量 ASM 知识,就无法对其进行补充。

于 2021-12-16T17:18:15.480 回答
0

它似乎没有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 中使用的未定义常量的值是多少?

#if __STDC_NO_THREADS__

这与 OP 的代码相匹配,所以我希望它可以与兼容的 C11 编译器一起使用。


然而,看起来 OP每个@Kevin都有一个解决方案。这可能是一个错误的解决方案,因为 看起来像是一个错字(缺少尾随)。__STDC_NO_THREADS__

#if !defined(__STDC_NO_THREADS) || __STDC_NO_THREADS__
于 2018-04-28T15:28:30.450 回答
-18

在 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;
}
于 2013-05-03T17:05:47.277 回答