web-dev-qa-db-ja.com

MinGWで実験的なC ++ 11同時実行機能を有効にする方法は?

次のコードをコンパイルしようとすると

#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はこのコードサンプルを適切に実行します。

22
Loom

私の知る限り、MinGWはまだ新しいc ++ 0x同時実行機能をサポートしていません(GCC 4.5以降)。 MinGWでスレッドヘッダーからの次のifdefが満たされていないことが指摘されたメーリングリスト交換を読んだことを覚えています。

#if defined(_GLIBCXX_HAS_GTHREADS)

これは、ネイティブスレッドまたはpthreadなどを使用するかどうかにかかわらず、WindowsでのMinGWの構築方法に何らかの形で関連していると思います。私のコードでは、ネイティブc ++ 0xスレッドの代わりにBoost.threadを使用する最小限のラッピングを記述しました。 Windowsで。 2つのインターフェースは非常に似ており、多くの用途で問題なく交換できます。

[〜#〜] edit [〜#〜]:LucDantonに掘り下げてくれてありがとう上記のメーリングリストスレッド:

http://comments.gmane.org/gmane.comp.gnu.mingw.user/33065

14
bluescarni

私は現在、新しいmingw-w64winpthreadsライブラリを使用するGCCを強化することに取り組んでいます。これにより、GCCでposixスレッドモデルが有効になり、正常に機能させるための作業が進行中です。別のmingw-w64ユーザーは、(賢明に)ハッキングすることですでにこの機能を利用していますが、ツールチェーンのインストール後に手動で介入することなく、メインラインのGCCでそれを実行しようとしています。

現在の議論は続くことができます ここ 。すべての粗いエッジが滑らかになったら、この回答を更新します。

[〜#〜]編集[〜#〜]:賛成票があったため、この回答が私の注意を引きました。実験的なGCC4.7を作成しました。これは、std::threadで動作するはずですが、静的にリンクする場合に限ります(-staticをlinkコマンドに追加します)。発表は ここ です。

5
rubenvb

他の人が言及したように、gccのmingwポートは、そのままではC++ 0xの同時実行サポートを提供しません。ただし、商用の just :: thread library はこれらの機能を提供するため、std::threadgcc4.5.2のTDM/mingwポート で使用できます。

免責事項:私はjust :: threadライブラリの主要な開発者です。

4

C++ 0xライブラリステータスページ は実装されていると言っていますが、そのページにすべてをリストするには、SVNバージョンが必要な場合があります。 このページ 最先端のビルドを取得するのに役立つようです。

4
Ben Voigt

Std :: threadsとsyncプリミティブの軽量ネイティブ実装がすでにあります: https://github.com/meganz/mingw-std-threads

これはヘッダーのみのライブラリであり、MinGWのすべてのC++ 11バージョンで動作するはずです。

3

std::threadをサポートするコンパイラを入手した場合、修正した例を次に示します(2つのマイナータイプ-o)。

#include <thread>
#include <iostream>

void foo() { std::cout << "foo\n"; }

int main()
{
  std::thread t(foo);
  t.join();
}
2
Howard Hinnant

MinGwビルドを試してください:

http://sourceforge.net/projects/mingwbuilds/

このインストーラーを使用すると、必要なMinGWを選択でき、c ++ 11スレッド機能も含まれます。

1
Darth Vader

別のオプションがあります。

//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
0