を使用してC11コードをコンパイルしようとしていますthread.h
が、できません。GCCを再コンパイルし(現在4.6.2を実行)、を使用してコンパイルしようとしていますgcc -std=c1x file.c -o file
。これはg++で(つまり、thread
ライブラリを使用して)実行できますが、Cでは実行できませthread.h
ん。GCCディストリビューションにはまだ含まれていませんか?
4 に答える
スレッド化の標準C11ヘッダーは<threads.h>
、ではなく<thread.h>
です。N1570ドラフトのセクション7.26を参照してください。
たとえばstdioを含むほとんどのC標準ライブラリは、gccディストリビューションに含まれていません。代わりに、gccは、オペレーティングシステムによって提供されるランタイムライブラリに依存します。これには通常、ヘッダー(など<threads.h>
)とライブラリを実装する実際のコードの両方が含まれます。
ほとんどのLinuxシステム(または必要に応じてGNU / Linux)の場合、ライブラリはGNUのglibcです。他のシステムの場合、それは別のものになります。
したがって、本当の問題は、おそらくglibc、または使用しているCライブラリがC11のスレッド機能をサポートするのはいつかということです。
glibcは、バージョン2.28でC11スレッドのサポートを追加します。Ubuntu 18.04.1 LTSシステムは、現在もglibc2.27を使用しています。繰り返しますが、これはGNU libcを使用する実装にのみ適用され、すべてのgccベースの実装には適用されません。コメントでWorldSEnderによって言及されました。
更新:Ubuntu 18.10(LTS(ロングタームサポート)リリースではない)には、をサポートするglibc2.28があります<threads.h>
。また、user2548688の回答が指摘しているように、 muslCライブラリはをサポートしています<threads.h>
。Ubuntuでは、musl-dev
パッケージをインストールしてmusl-gcc
コマンドを使用できます。
(ライブラリのいくつかの部分、つまりコンパイラに最も密接に関連している部分は、gcc自体によって提供されることに注意してください。スレッドライブラリはおそらくそれらの1つではありませんが、確かにコンパイラのサポートが必要です。)
詳細については、こちらを参照してください。
... (アトミック - stdatomic.h - はオプションであり、関連する言語機能が GCC 4.8 で実装されるのを待つ必要があるでしょう。threads.h のオプションのスレッド インターフェイスと Annex の境界チェック インターフェイスは、おそらくK は今のところ glibc には必要ありませんが、別のライブラリに入る可能性はあります。
私の推測では、少なくとも標準の glibc と gcc では、これが実装されるのはしばらく先になると思います (出典の投稿で洞察が得られます)。私の個人的な推測では、1 年ほどかかると思われます。本番環境で使用できるほど安定するまでには、おそらく 2 年ほどかかるでしょう。Thats 2k14 (assert(survival_2012)) :P
C11に関するGCC標準ページから引用するには:
GCC は、この標準の一部の不完全なサポートを制限しています
私は GCC 4.6.1 しか持っていませんが、システムのどこにも「thread.h」ヘッダー ファイルがありません。
4.6と4.7のどちらの変更ページにも、スレッドについては言及されていません。
4.7 の変更ページに記載されている「スレッド」がありますが、C11 コンテキストではそれと関係があると思われるものは何もありません。また、C11 については、次の4.8ページでは何も言及されていません。
musl libc には C11 が あります http://www.musl-libc.org/ glibc は threads.h をまだサポートしていません