web-dev-qa-db-ja.com

名前空間stdのC ++ミューテックスが型に名前を付けていません

ロックの使用方法を示すために、単純なC++プログラムを作成しています。 codeblocksおよびgnugccコンパイラを使用しています。

 #include <iostream>
 #include <thread>
 #include <mutex>
 using namespace std;
 int x = 0; // shared variable

 void synchronized_procedure()
 {
    static std::mutex m;
    m.lock();
    x = x + 1;
    if (x < 5)
    {
       cout<<"hello";
    }
    m.unlock();

 }

int main()
{

   synchronized_procedure();
   x=x+2;
   cout<<"x is"<<x;
}

次のエラーが表示されます:mutex in namespace std does not name a type

このエラーが発生するのはなぜですか?コンパイラはロックの使用をサポートしていませんか?

24
arjun

たまたま同じ問題を見ていた。 GCCはLinuxでstd::mutexで正常に動作します。ただし、Windowsでは状況はさらに悪いようです。 MinGW GCC 4.7.2に同梱されている<mutex>ヘッダーファイル(MinGW GCCバージョンも使用していると思われます)では、mutexクラスが次の#ifガードの下で定義されていることがわかりました。

#if defined(_GLIBCXX_HAS_GTHREADS) && defined(_GLIBCXX_USE_C99_STDINT_TR1)

残念ながら、_GLIBCXX_HAS_GTHREADSはWindowsでは定義されていません。実行時サポートは単に存在しません。

また、GCCの達人が助けてくれる場合に備えて、MinGWメーリングリストで直接質問することもできます。

編集:MinGW-w64プロジェクトは、必要なランタイムサポートを提供します。 http://mingw-w64.sourceforge.net/ および https://sourceforge.net/projects/mingw-w64/files/ を確認してください。また、0xC0000022Lが指摘したように、POSIXスレッドバージョンをダウンロードする必要があります(前回言及するのを逃しました)。

16
Yongwei Wu

これは現在、MingW(バージョン2013072300)に含まれています。これを含めるには、MinGW Installation Managerでpthreadsパッケージを選択する必要があります。

Pthreads package options from MingW Installation Manager

13
IntuAi

少なくともミューテックスは、Mingw-buildsツールチェーンの「スレッドモデル:win32」ではサポートされていません。 「スレッドモデル:posix」のツールチェーンを選択する必要があります。いくつかのバージョンとリビジョン(アーキテクチャi686とx86_64の両方)を試した後、決定要因であるスレッドモデルIMOであるx86_64-4.9.2-posix-seh-rt_v3-rev1でのみサポートが見つかりました。

6
Walter Waldo

MingW-W64 7.2.0を使用しているときに、この同じ問題が発生しました。 mingw-64ダウンロードページ からいくつかの異なるWindowsビルドをテストしましたが、 MinGW-W64 GCC-8.1.mutexをサポートし、 pthreadライブラリ。インストール時に、次のオプションを選択しました。

  • x86_64
  • posix

pthreadsに基づくマルチスレッドコードは、WindowsとLinuxの両方で変更なしで正常にコンパイルおよび実行されます。

Installed MingW version on Windows 8.1

このバージョンには、CygWin環境またはパッケージマネージャーがないため、使用していた7.3.0ビルドよりも無駄がありません。また、mingw32-make.exemake.exeにコピーしたため、Makefileを変更する必要はありません。インストーラーは、Windowsの[スタート]メニューに[端末の実行]リンクを作成します。

Building and running pthread application on Windows 8.1 using MingW

2
vallismortis

MINGWにはPOSIXスレッドモデルを使用します。

$ Sudo update-alternatives --config i686-w64-mingw32-gcc
<choose i686-w64-mingw32-gcc-posix from the list>

$ Sudo update-alternatives --config i686-w64-mingw32-g++
<choose i686-w64-mingw32-g++-posix from the list>

$ Sudo update-alternatives --config x86_64-w64-mingw32-gcc
<choose x86_64-w64-mingw32-gcc-posix from the list>

$ Sudo update-alternatives --config x86_64-w64-mingw32-g++
<choose x86_64-w64-mingw32-g++-posix from the list>

参照: mingw-w64 threads:posix vs win32

2
Amir Saniyan

誰にでもうまくいくかどうかはわかりませんが、別の方法では、ndkを更新するだけです。私はndk-r11cを使用していますが、完全に機能します。

1
Bastienm

Gcc4.7.7でも同じエラーが発生しました。

「-std = c ++ 0x」を追加した後、修正されました。

1
Doan Quang Viet

今日、このエラーに直面しています。次の手順で修正しました。

  • プロジェクト>ビルドオプション...
  • デフォルトで選択されているコンパイラ:GNU GCC Compiler
  • [コンパイラ設定/コンパイラフラグ]タブで、[g ++をC++ 11 ISO C++言語標準[-std = c ++ 11]に準拠させる]オプションをオンにします

幸運を。

0
TungBui