web-dev-qa-db-fra.com

Le mutex C++ dans l'espace de noms std ne nomme pas un

J'écris un simple programme C++ pour démontrer l'utilisation des verrous. J'utilise le compilateur codeblocks et 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;
}

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?

19
arjun

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/

15
Yongwei Wu

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.

Pthreads package options from MingW Installation Manager

12
geekonedge

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.

5
Walter Waldo

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.

2
Bastienm

J'ai la même erreur avec gcc4.7.7.

Après avoir ajouté "-std = c ++ 0x", le problème est résolu.

1
Doan Quang Viet

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:

  • x86_64
  • posix
  • seh

Mon code multithread basé sur pthreads est maintenant compilé et fonctionne correctement sous Windows et Linux sans aucune modification.

 Installed MingW version on Windows 8.1

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.

 Building and running pthread application on Windows 8.1 using MingW

0
vallismortis

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

0
Amir Saniyan

Je fais face à cette erreur aujourd'hui et je l'ai corrigé en procédant comme suit:

  • Projet> Option de construction ... 
  • Le compilateur sélectionné par défaut: GNU Compilateur GCC 
  • Dans l'onglet "Paramètres du compilateur/Drapeaux du compilateur", cochez l'option "G ++ doit suivre la norme de langage C++ 11 ISO C++ [-std = c ++ 11]"

Bonne chance.

0
TungBui