C ++ std下互斥没有指定类型(C++ mutex in namespace std does

2019-07-17 22:37发布

我正在写一个简单的C ++程序来演示锁的使用。 我使用的codeblocksgnu 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

为什么会出现这个错误? 没有编译器支持使用锁?

Answer 1:

我正好在看同样的问题。 GCC工作正常std::mutex Linux下。 但是,在Windows事情似乎要差一些。 在附带的MinGW GCC 4.7.2(我相信你使用的是MinGW的GCC版本太多)的<互斥>头文件,我发现互斥体类按下列定义#if后卫:

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

遗憾的是, _GLIBCXX_HAS_GTHREADS未在Windows中定义。 运行时支持是根本不存在。

您也可以直接问MinGW的邮件列表上的问题,在某些情况下,GCC大师可以帮您解决。

编辑:MinGW的-W64项目提供了必要的运行时支持。 退房http://mingw-w64.sourceforge.net/



Answer 2:

现在这已被列入MingW平台(版本2013072300)。 要包含它,你必须选择并行线程包MinGW的安装管理器。



Answer 3:

互斥,至少,不支持“的线程模型:win32的”的MinGW的-构建工具链。 您必须选择任何与“线程模型:POSIX”的工具链。 有几个版本和修订版本(这两种架构的i686和x86_64)尝试后,我才发现,在x86_64-4.9.2-POSIX的SEH-rt_v3-REV1支持作为线程模型,IMO的决定因素。



Answer 4:

我不知道这是否适用于每个人,但在其他的方式,你只需要更新您的NDK。 我使用NDK-r11c和它完美的作品。



Answer 5:

我买了gcc4.7.7同样的错误。

加入后 “-std =的C ++ 0x”,它是固定的。



Answer 6:

今天我面对这个错误,并通过以下步骤修复它:

  • 项目>构建选项...
  • 默认选择的编译器:GNU GCC编译器
  • 选项卡 “编译器设置/编译器标记”,检查选项 “有克++遵循C ++ 11 ISO C ++语言标准[-std = C ++ 11]”

祝好运。



Answer 7:

我使用的MingW-W64 7.2.0时遇到同样的问题。 我测试了从几个不同的Windows建立的MinGW-64下载页面 ,发现的MinGW-W64 GCC-8.1.0支持mutex ,包含pthread库。 安装时,我选择了以下选项:

  • x86_64的
  • POSIX
  • SEH

我的基于多线程代码pthreads现在编译和顺利运行在Windows和Linux都没有变化。

这个版本比7.3.0构建我用,因为它没有一个Cygwin环境或包管理器精简。 我也复制mingw32-make.exemake.exe所以我的Makefile文件就不需要修改。 安装程序会在Windows开始菜单“运行终端”的链接。



Answer 8:

使用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线程:POSIX VS的Win32



Answer 9:

标准线程库的许多类可以与升压的人所取代。 一个非常简单的方法就是改变整个标准mutex文件有几行。

#include <boost/thread.hpp>

namespace std
{
   using boost::mutex;
   using boost::recursive_mutex;
   using boost::lock_guard;
   using boost::condition_variable;
   using boost::unique_lock;
   using boost::thread;
}

而且不要忘了对升压线程库链接。



文章来源: C++ mutex in namespace std does not name a type