我正在编写一个简单的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
。
为什么我会收到此错误? 编译器不支持使用锁吗?
对 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>
我碰巧也在看同样的问题。 GCC 在 Linux 下与
std::mutex
配合得很好。然而,在 Windows 上情况似乎更糟。在 MinGW GCC 4.7.2 附带的 #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 线程版本(我上次没有提到)。
现已包含在 MingW(版本 2013072300)中。要包含它,您必须在 MinGW Installation Manager 中选择 pthreads 包。
至少 Mingw 构建工具链的“线程模型:win32”不支持互斥。您必须选择带有“Thread model: posix”的任何工具链。在尝试了多个版本和修订版(架构 i686 和 x86_64)之后,我只发现 x86_64-4.9.2-posix-seh-rt_v3-rev1 中的支持是线程模型,IMO,决定因素。
我在使用 MingW-W64 7.2.0 时遇到了同样的问题。我从 mingw-64 下载页面测试了几个不同的 Windows 版本,发现 MinGW-W64 GCC-8.1.0 支持
mutex
并包含 pthread
库。安装时,我选择了以下选项:
我基于
pthreads
的多线程代码现在可以在 Windows 和 Linux 上干净地编译和运行,无需任何更改。
这个版本比我使用的 7.3.0 版本更精简,因为它没有 CygWin 环境或包管理器。我还将
mingw32-make.exe
复制到 make.exe
,这样我的 Makefile 就不需要修改。安装程序会在 Windows 开始菜单中创建一个“运行终端”链接。
我在 gcc4.7.7 上遇到了同样的错误。
添加“-std=c++0x”后修复。
我的 gcc 版本是 5.4,我在添加 #include 并在我的 CmakeLists.txt 中添加 -std=c++11 时解决了这个问题,如下所示:
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -O3 -march=native -std=c++11")
我通过以下步骤修复了它:
我不知道它是否对每个人都有效,但以其他方式你只需要更新你的 ndk 即可。我正在使用 ndk-r11c,它运行得很好。
标准线程库的许多类都可以用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 线程库。