次のコードをコンパイルしようとすると
#include <thread>
#include <iostream>
void foo() { std::cout << "foo\n"; }
int main()
{
std::thread t(foo);
t.join();
}
エラーが発生します:
C:\Test>g++ -g -Wall -lpthread -std=c++0x
main.cpp
main.cpp: In function 'int main()':
main.cpp:12:2: error: 'thread' is not a member of 'std'
main.cpp:12:14: error: expected ';' before 't'
main.cpp:13:2: error: 't' has not been declared
C++ 11の実験的な同時実行機能を使用するにはどうすればよいですか? MinGW GCC 4.5.1(TDM)を持っています
編集:ところで、Visual Studio2012はこのコードサンプルを適切に実行します。
私の知る限り、MinGWはまだ新しいc ++ 0x同時実行機能をサポートしていません(GCC 4.5以降)。 MinGWでスレッドヘッダーからの次のifdefが満たされていないことが指摘されたメーリングリスト交換を読んだことを覚えています。
#if defined(_GLIBCXX_HAS_GTHREADS)
これは、ネイティブスレッドまたはpthreadなどを使用するかどうかにかかわらず、WindowsでのMinGWの構築方法に何らかの形で関連していると思います。私のコードでは、ネイティブc ++ 0xスレッドの代わりにBoost.threadを使用する最小限のラッピングを記述しました。 Windowsで。 2つのインターフェースは非常に似ており、多くの用途で問題なく交換できます。
[〜#〜] edit [〜#〜]:LucDantonに掘り下げてくれてありがとう上記のメーリングリストスレッド:
私は現在、新しいmingw-w64winpthreadsライブラリを使用するGCCを強化することに取り組んでいます。これにより、GCCでposixスレッドモデルが有効になり、正常に機能させるための作業が進行中です。別のmingw-w64ユーザーは、(賢明に)ハッキングすることですでにこの機能を利用していますが、ツールチェーンのインストール後に手動で介入することなく、メインラインのGCCでそれを実行しようとしています。
現在の議論は続くことができます ここ 。すべての粗いエッジが滑らかになったら、この回答を更新します。
[〜#〜]編集[〜#〜]:賛成票があったため、この回答が私の注意を引きました。実験的なGCC4.7を作成しました。これは、std::thread
で動作するはずですが、静的にリンクする場合に限ります(-static
をlinkコマンドに追加します)。発表は ここ です。
他の人が言及したように、gccのmingwポートは、そのままではC++ 0xの同時実行サポートを提供しません。ただし、商用の just :: thread library はこれらの機能を提供するため、std::thread
を gcc4.5.2のTDM/mingwポート で使用できます。
免責事項:私はjust :: threadライブラリの主要な開発者です。
C++ 0xライブラリステータスページ は実装されていると言っていますが、そのページにすべてをリストするには、SVNバージョンが必要な場合があります。 このページ 最先端のビルドを取得するのに役立つようです。
Std :: threadsとsyncプリミティブの軽量ネイティブ実装がすでにあります: https://github.com/meganz/mingw-std-threads
これはヘッダーのみのライブラリであり、MinGWのすべてのC++ 11バージョンで動作するはずです。
std::thread
をサポートするコンパイラを入手した場合、修正した例を次に示します(2つのマイナータイプ-o)。
#include <thread>
#include <iostream>
void foo() { std::cout << "foo\n"; }
int main()
{
std::thread t(foo);
t.join();
}
MinGwビルドを試してください:
http://sourceforge.net/projects/mingwbuilds/
このインストーラーを使用すると、必要なMinGWを選択でき、c ++ 11スレッド機能も含まれます。
別のオプションがあります。
//Threading01.cpp
#include <thread>
#include <iostream>
void hello()
{
std::cout<< "Hello Threading ..." << std::endl;
}
int main()
{
std::thread t1(hello);
t1.join();
return 0;
}
ダウンロード mingw-w64 (sourceforge.netのmingw-w64プロジェクトは mingw-w64.org に移動しています)そして.batファイル(mingw-w64.bat)を実行します提供されたコマンドラインで、次のようにスレッドコードを実行できます
C:\CPP>g++ std=c++11 -g -Wall -lpthread -o Threading01 Threading01.cpp