web-dev-qa-db-ja.com

GCCのC11 <thread.h>?

thread.hを使用してC11コードをコンパイルしようとしていますが、できません。 GCCを再コンパイルし(4.6.2を実行中)、gcc -std=c1x file.c -o fileでコンパイルしようとしています。これはg ++で(threadライブラリを使用して)実行できますが、Cでは実行できません。thread.hはまだGCCディストリビューションに含まれていませんか?

28
Dervin Thunk

スレッド化の標準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システムは現在もglibc 2.27を使用しています。繰り返しますが、これはGNU libcを使用する実装にのみ適用され、すべてのgccベースの実装には適用されません。WorldSEnderによりコメントで言及されています。

更新:Ubuntu 18.10(LTS(Long Term Support)リリースではない)には、<threads.h>をサポートするglibc 2.28があります。また、 ser2548688の回答 が指摘しているように、 musl Cライブラリ<threads.h>をサポートしています。 Ubuntuでは、musl-devパッケージをインストールしてmusl-gccコマンドを使用できます。

(ライブラリーのいくつかの部分、コンパイラーに最も密接に関連している部分は、gcc自体によって提供されるであることに注意してください。スレッド化ライブラリーおそらくはそれらの1つではありませんが、確かにいくつかのコンパイラのサポートが必要です。)

41
Keith Thompson

これに関する詳細情報は here にあります。

...(Atomics-stdatomic.h-はオプションであり、関連する言語機能がGCC 4.8に実装されるのを待つ必要があるでしょう。threads.hのオプションのスレッドインターフェイスとAnnexの境界チェックインターフェイスは、 Kは今のところglibcには必要ありませんが、別々のライブラリに入る可能性があります。

私の推測では、少なくとも標準のglibcとgccでは、これが実装されることはしばらくありません(ソース付きの投稿は洞察を提供します)。私の個人的な推測は1年のようなものです。生産で使用するのに十分安定するまでには、おそらく2年程度かかるでしょう。それ2k14(assert(survival_2012)):P

9
pruzinat

GCCから引用するには 標準ページ C11について:

GCCは、この標準の一部の不完全なサポートを制限しています

GCC 4.6.1しかありませんが、システムのどこにも「thread.h」ヘッダーファイルはありません。

4.6 の変更ページも 4.7 の変更ページもスレッドについて言及していません。


4.7の変更ページで言及されている「スレッド」がありますが、C11のコンテキストではそれと関係があるようには見えません。また、今後の 4.8 ページでは、C11については何も言及されていません。

musl libcにはC11があります http://www.musl-libc.org/ glibcはまだthreads.hをサポートしていません

2
user2548688