wake-up-neo.com

C++ - Mutex im Namespace std benennt keinen Typ

Ich schreibe ein einfaches C++ - Programm, um die Verwendung von Sperren zu demonstrieren. Ich verwende codeblocks und gnugcc Compiler.

 #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;
}

Ich erhalte die folgende Fehlermeldung: mutex in namespace std does not name a type.

Warum erhalte ich diese Fehlermeldung? Unterstützt der Compiler nicht die Verwendung von Sperren?

19
arjun

Ich habe das gleiche Problem gesehen. GCC funktioniert gut mit std::mutex unter Linux. Unter Windows scheint es jedoch schlimmer zu sein. In der mit MinGW GCC 4.7.2 gelieferten <mutex> -Headdatei (ich glaube, dass Sie auch eine MinGW-GCC-Version verwenden) habe ich festgestellt, dass die Mutex-Klasse unter dem folgenden #if-Guard definiert ist:

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

Bedauerlicherweise ist _GLIBCXX_HAS_GTHREADS unter Windows nicht definiert. Die Laufzeitunterstützung ist einfach nicht vorhanden.

Sie können auch Fragen direkt auf der MinGW-Mailingliste stellen, falls ein GCC-Gurus Ihnen helfen könnte.

BEARBEITEN: Die MinGW-w64-Projekte bieten die erforderliche Laufzeitunterstützung. Check out http://mingw-w64.sourceforge.net/

15
Yongwei Wu

Dies ist jetzt in MingW (Version 2013072300) enthalten. Um es aufzunehmen, müssen Sie das pthreads-Paket im MinGW Installation Manager auswählen.

Pthreads package options from MingW Installation Manager

12
geekonedge

Zumindest Mutex wird in 'Thread model: win32' der Mingw-Builds-Toolchains nicht unterstützt. Sie müssen eine der Toolchains mit 'Gewindemodell: Posix' auswählen. Nachdem ich mehrere Versionen und Versionen (beide Architekturen i686 und x86_64) ausprobiert hatte, fand ich nur Unterstützung in x86_64-4.9.2-posix-seh-rt_v3-rev1, wobei das Thread-Modell und IMO der bestimmende Faktor sind.

5
Walter Waldo

Ich weiß nicht, ob es für jeden funktioniert, aber auf andere Weise müssen Sie nur Ihre ndk aktualisieren. Ich benutze ndk-r11c und es funktioniert perfekt.

2
Bastienm

Ich habe den gleichen Fehler mit gcc4.7.7.

Nach dem Hinzufügen von "-std = c ++ 0x" ist dies behoben.

1
Doan Quang Viet

Dieses Problem trat bei der Verwendung von MingW-W64 7.2.0 auf. Ich habe verschiedene Windows-Builds von der mingw-64-Downloadseite aus getestet und fand heraus, dass MinGW-W64 GCC-8.1.0 / mutex unterstützt und die pthread-Bibliothek enthält. Bei der Installation habe ich folgende Optionen ausgewählt:

  • x86_64
  • posix
  • seh

Mein auf pthreads basierender Multi-Thread-Code wird jetzt unter Windows und Linux sauber und ohne Änderungen sauber ausgeführt.

 Installed MingW version on Windows 8.1

Diese Version ist schlanker als die Version 7.3.0, die ich verwendete, da sie keine CygWin-Umgebung oder Paket-Manager hat. Ich habe auch mingw32-make.exe in make.exe kopiert, damit mein Makefile nicht geändert werden muss. Das Installationsprogramm erstellt im Windows-Startmenü einen Link "Terminal ausführen".

 Building and running pthread application on Windows 8.1 using MingW

0
vallismortis

Verwenden Sie das POSIX-Threading-Modell für 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>

Siehe auch: mingw-w64-Threads: posix vs win32

0
Amir Saniyan

Ich stehe heute vor diesem Fehler und habe ihn durch folgende Schritte behoben:

  • Projekt> Erstellungsoption ... 
  • Der standardmäßig ausgewählte Compiler: GNU GCC-Compiler 
  • Aktivieren Sie auf der Registerkarte "Compiler-Einstellungen/Compiler-Flags" die Option "Lassen Sie g ++ den C++ 11-ISO-C++ - Sprachstandard [-std = c ++ 11] befolgen."

Viel Glück.

0
TungBui