ロックの使用方法を示すために、単純なC++プログラムを作成しています。 codeblocks
およびgnu
gcc
コンパイラを使用しています。
#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
。
このエラーが発生するのはなぜですか?コンパイラはロックの使用をサポートしていませんか?
たまたま同じ問題を見ていた。 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スレッドバージョンをダウンロードする必要があります(前回言及するのを逃しました)。
これは現在、MingW(バージョン2013072300)に含まれています。これを含めるには、MinGW Installation Managerでpthreadsパッケージを選択する必要があります。
少なくともミューテックスは、Mingw-buildsツールチェーンの「スレッドモデル:win32」ではサポートされていません。 「スレッドモデル:posix」のツールチェーンを選択する必要があります。いくつかのバージョンとリビジョン(アーキテクチャi686とx86_64の両方)を試した後、決定要因であるスレッドモデルIMOであるx86_64-4.9.2-posix-seh-rt_v3-rev1でのみサポートが見つかりました。
MingW-W64 7.2.0を使用しているときに、この同じ問題が発生しました。 mingw-64ダウンロードページ からいくつかの異なるWindowsビルドをテストしましたが、 MinGW-W64 GCC-8.1. はmutex
をサポートし、 pthread
ライブラリ。インストール時に、次のオプションを選択しました。
pthreads
に基づくマルチスレッドコードは、WindowsとLinuxの両方で変更なしで正常にコンパイルおよび実行されます。
このバージョンには、CygWin環境またはパッケージマネージャーがないため、使用していた7.3.0ビルドよりも無駄がありません。また、mingw32-make.exe
をmake.exe
にコピーしたため、Makefileを変更する必要はありません。インストーラーは、Windowsの[スタート]メニューに[端末の実行]リンクを作成します。
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>
誰にでもうまくいくかどうかはわかりませんが、別の方法では、ndkを更新するだけです。私はndk-r11cを使用していますが、完全に機能します。
Gcc4.7.7でも同じエラーが発生しました。
「-std = c ++ 0x」を追加した後、修正されました。
今日、このエラーに直面しています。次の手順で修正しました。
幸運を。