36

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

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

4

11 回答 11

23

我碰巧在看同样的问题。GCCstd::mutex在 Linux 下运行良好。但是,在 Windows 上,情况似乎更糟。在 MinGW GCC 4.7.2 附带的 <mutex> 头文件中(我相信您也使用了 MinGW GCC 版本),我发现 mutex 类是在以下#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 线程版本(我上次没有提到它)。

于 2013-08-01T06:35:41.700 回答
19

对 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

于 2018-11-28T21:26:30.093 回答
14

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

MingW 安装管理器中的 Pthreads 包选项

于 2015-06-15T15:47:28.283 回答
7

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

于 2014-12-23T00:44:03.097 回答
3

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

  • x86_64
  • 正则表达式

我基于pthreadsnow 的多线程代码可以在 Windows 和 Linux 上干净地编译和运行,无需任何更改。

在 Windows 8.1 上安装 MingW 版本

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

使用 MingW 在 Windows 8.1 上构建和运行 pthread 应用程序

于 2018-11-18T16:47:35.457 回答
2

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

添加“-std=c++0x”后,修复。

于 2017-12-04T04:44:10.340 回答
1

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

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall  -O3 -march=native -std=c++11")
于 2019-12-26T01:44:31.570 回答
1

我通过以下步骤修复了它:

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

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

于 2016-06-03T08:14:17.097 回答
0

我安装了 Cygwin 而不是 WinGW。youtube 上的说明 https://www.youtube.com/watch?v=DAlS4hF_PbY&t=245s

于 2020-10-13T19:41:00.980 回答
-8

标准线程库的许多类都可以替换为 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 线程库。

于 2013-07-03T05:43:52.163 回答