【问题标题】:clang c11 threads.h not found铿锵 c11 threads.h 未找到
【发布时间】:2013-04-26 19:50:17
【问题描述】:

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

__STDC_NO_THREADS__整数常量1,意在表示实现不支持头。

【问题讨论】:

  • 好像没有找到threads.h 文件。
  • 在我看来也是这样 :) 如果 STDC_NO_THREADS 宏不是 1,它应该是 c11 中 startdard 库的一部分
  • 我猜你应该检查那个文件夹,看看threads.h是否真的在那里,如果是,看看编译器是否可以访问它。
  • 似乎不在 xcode 包中...根据find /Applications/Xcode.app/Contents -name threads.h
  • 试试#if !defined(__STDC_NO_THREADS) || __STDC_NO_THREADS__

标签: c xcode clang c11 threads.h


【解决方案1】:

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

【讨论】:

  • 如果您愿意构建不同的 C 库,那可能会更简单。我最近研究了 musl (musl-libc.org),那里的任务似乎是可行的。如果您对 POSIX 的封装感到满意,我的 P99 (p99.gforge.inria.fr) 就足够了。
  • 我从来没有看过任何替代品(我现在会)......它最终需要在 glibc / gcc / clang ......如果它只是 posix 线程的包装器,其中他们得到支持......那么我认为这就足够了。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    它似乎没有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__
    

    或根据What is the value of an undefined constant used in #if?

    #if __STDC_NO_THREADS__
    

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


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

    #if !defined(__STDC_NO_THREADS) || __STDC_NO_THREADS__
    

    【讨论】:

      【解决方案4】:

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

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

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

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

      需要注意的是,OSX 还支持其他一些 C11 功能,例如 C11 Atomics,如果没有大量 ASM 知识,就无法补充这些功能。

      【讨论】:

      • 是的......委员会迟到 2011 年才发布线程支持并认为它会得到实施,当时像 pthreads 这样的事实上的标准已经在 10 多年前建立起来了,这太天真了。我不知道他们没有将 pthreads 设为标准 C 库的原因,但我非常怀疑原因是技术性的。更有可能与政治和声望有关。
      【解决方案5】:

      在 C++11 中,你想要#include &lt;thread&gt;,而不是threads.h

      #include <iostream>
      #include <thread>
      
      void fun() { std::cout << "fun!" << std::endl; }
      
      int main() {
          std::thread t ( fun );
          t.join ();
          return 0;
      }
      

      【讨论】:

      • 是的,这特别是关于不太被炒作的 C11
      猜你喜欢
      • 2013-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-25
      • 1970-01-01
      • 2016-10-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多