我正在写一个简单的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
。
为什么会出现这个错误? 没有编译器支持使用锁?
我正好在看同样的问题。 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/
现在这已被列入MingW平台(版本2013072300)。 要包含它,你必须选择并行线程包MinGW的安装管理器。
互斥,至少,不支持“的线程模型:win32的”的MinGW的-构建工具链。 您必须选择任何与“线程模型:POSIX”的工具链。 有几个版本和修订版本(这两种架构的i686和x86_64)尝试后,我才发现,在x86_64-4.9.2-POSIX的SEH-rt_v3-REV1支持作为线程模型,IMO的决定因素。
我不知道这是否适用于每个人,但在其他的方式,你只需要更新您的NDK。 我使用NDK-r11c和它完美的作品。
我买了gcc4.7.7同样的错误。
加入后 “-std =的C ++ 0x”,它是固定的。
我使用的MingW-W64 7.2.0时遇到同样的问题。 我测试了从几个不同的Windows建立的MinGW-64下载页面 ,发现的MinGW-W64 GCC-8.1.0支持mutex
,包含pthread
库。 安装时,我选择了以下选项:
我的基于多线程代码pthreads
现在编译和顺利运行在Windows和Linux都没有变化。
这个版本比7.3.0构建我用,因为它没有一个Cygwin环境或包管理器精简。 我也复制mingw32-make.exe
到make.exe
所以我的Makefile文件就不需要修改。 安装程序会在Windows开始菜单“运行终端”的链接。
使用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
标准线程库的许多类可以与升压的人所取代。 一个非常简单的方法就是改变整个标准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;
}
而且不要忘了对升压线程库链接。