J'écris un simple programme C++ pour démontrer l'utilisation des verrous. J'utilise le compilateur codeblocks
et 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;
}
Je reçois l'erreur suivante: mutex in namespace std does not name a type
.
Pourquoi est-ce que je reçois cette erreur? Le compilateur ne prend-il pas en charge l'utilisation des verrous?
Je me trouvais en train de regarder le même problème. GCC fonctionne bien avec std::mutex
sous Linux. Cependant, sous Windows, les choses semblent être pires. Dans le fichier d'en-tête <mutex> fourni avec MinGW GCC 4.7.2 (je pense que vous utilisez également une version de MinGW GCC), j'ai constaté que la classe mutex est définie sous la protection #if
suivante:
#if defined(_GLIBCXX_HAS_GTHREADS) && defined(_GLIBCXX_USE_C99_STDINT_TR1)
Malheureusement, _GLIBCXX_HAS_GTHREADS
n'est pas défini sous Windows. Le support d'exécution n'est tout simplement pas là.
Vous pouvez également poser des questions directement sur la liste de diffusion de MinGW, au cas où certains gourous de GCC pourraient vous aider.
EDIT: Les projets MinGW-w64 fournissent le support d’exécution nécessaire. Découvrez http://mingw-w64.sourceforge.net/
Cela a maintenant été inclus dans MingW (Version 2013072300). Pour l'inclure, vous devez sélectionner le paquet pthreads dans le gestionnaire d'installation MinGW.
Mutex, du moins, n'est pas pris en charge dans 'Modèle de thread: win32' des chaînes d'outils Mingw-builds. Vous devez sélectionner l'une des chaînes d'outils avec 'Modèle de fil: posix'. Après avoir essayé plusieurs versions et révisions (les deux architectures i686 et x86_64), je n’ai trouvé de support que dans x86_64-4.9.2-posix-seh-rt_v3-rev1 étant le modèle de thread, IMO le facteur déterminant.
Je ne sais pas si cela fonctionne pour tout le monde, mais d'une autre manière il suffit de mettre à jour votre ndk J'utilise ndk-r11c et cela fonctionne parfaitement.
J'ai la même erreur avec gcc4.7.7.
Après avoir ajouté "-std = c ++ 0x", le problème est résolu.
J'ai rencontré ce même problème lors de l'utilisation de MingW-W64 7.2.0. J'ai testé plusieurs versions de Windows à partir de la page de téléchargement mingw-64 et constaté que MinGW-W64 GCC-8.1.0 prend en charge mutex
et contient la bibliothèque pthread
. Lors de l'installation, j'ai sélectionné les options suivantes:
Mon code multithread basé sur pthreads
est maintenant compilé et fonctionne correctement sous Windows et Linux sans aucune modification.
Cette version est plus légère que la version 7.3.0 que j'utilisais car elle ne possède pas d'environnement CygWin ni de gestionnaire de paquets. J'ai aussi copié mingw32-make.exe
dans make.exe
pour que mon Makefile n'ait pas besoin d'être modifié. Le programme d'installation crée un lien "Exécuter le terminal" dans le menu Démarrer de Windows.
Utilisez le modèle de threading POSIX pour MINGW:
$ 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>
Voir aussi: mingw-w64 discussions: posix vs win32
Je fais face à cette erreur aujourd'hui et je l'ai corrigé en procédant comme suit:
Bonne chance.