命名空间 std 中的 C++ 互斥不命名类型

问题描述 投票:0回答:10

我正在编写一个简单的 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
.

为什么我会收到这个错误? 编译器不支持使用锁吗?

c++ multithreading compiler-errors locking mingw
10个回答
23
投票

我正好在看同样的问题。 GCC 在 Linux 下与

std::mutex
一起工作良好。但是,在 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/https://sourceforge.net/projects/mingw-w64/files/。另外,正如 0xC0000022L 所指出的,您需要下载 POSIX 线程版本(我上次没有提到它)。


20
投票

为 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


13
投票

现已包含在 MingW(版本 2013072300)中。要包含它,您必须在 MinGW 安装管理器中选择 pthreads 包。

Pthreads package options from MingW Installation Manager


7
投票

Mutex 至少在 Mingw 构建工具链的“线程模型:win32”中不受支持。您必须选择任何带有“线程模型:posix”的工具链。在尝试了多个版本和修订版(架构 i686 和 x86_64)之后,我只在 x86_64-4.9.2-posix-seh-rt_v3-rev1 中找到支持,这是线程模型,IMO,决定因素。


4
投票

我在使用 MingW-W64 7.2.0 时遇到了同样的问题。我从 mingw-64 下载页面 测试了几个不同的 Windows 版本,发现 MinGW-W64 GCC-8.1.0 支持

mutex
并包含
pthread
库。安装时,我选择了以下选项:

  • x86_64
  • posix
  • seh

我基于

pthreads
的多线程代码现在可以在 Windows 和 Linux 上干净地编译和运行,没有任何变化。

此版本比我使用的 7.3.0 版本更精简,因为它没有 CygWin 环境或包管理器。我还将

mingw32-make.exe
复制到
make.exe
这样我的 Makefile 就不需要修改了。安装程序在 Windows 开始菜单中创建一个“运行终端”链接。


2
投票

我在 gcc4.7.7 上遇到了同样的错误。

加上“-std=c++0x”后就固定了


1
投票

我的 gcc 版本是 5.4,我在添加 #include 并在我的 CmakeLists.txt 中添加 -std=c++11 时解决了这个问题,如下所示:

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall  -O3 -march=native -std=c++11")

1
投票

我通过以下步骤修复它:

  • 项目 > 构建选项...
  • 默认选择的编译器:GNU GCC Compiler
  • 在“编译器设置/编译器标志”选项卡上,选中选项 “让 g++ 遵循 C++11 ISO C++ 语言标准 [-std=c++11]”

0
投票

我不知道它是否适用于所有人,但在其他方面你只需要更新你的 ndk。我正在使用 ndk-r11c,它运行良好。


-9
投票

标准线程库的很多类都可以用boost类替换。一个非常简单的解决方法是用几行更改整个标准

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

并且不要忘记链接到 boost 线程库。

© www.soinside.com 2019 - 2024. All rights reserved.