命名空间 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个回答
25
投票

对 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 与 win32


24
投票

我碰巧也在看同样的问题。 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 线程版本(我上次没有提到)。


13
投票

现已包含在 MingW(版本 2013072300)中。要包含它,您必须在 MinGW Installation Manager 中选择 pthreads 包。

Pthreads package options from MingW Installation Manager


7
投票

至少 Mingw 构建工具链的“线程模型:win32”不支持互斥。您必须选择带有“Thread model: 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

我基于

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.