С++ мьютекс в пространстве имен std не называет тип
Я пишу простую 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
.
Почему я получаю эту ошибку? Разве компилятор не поддерживает использование блокировок?
Ответы
Ответ 1
Я случайно посмотрел на ту же проблему. GCC отлично работает с std::mutex
под Linux. Однако в Windows дела обстоят хуже. В заголовочном файле <mutex>, поставляемом с MinGW GCC 4.7.2 (я полагаю, вы также используете версию 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 (я пропустил упоминание об этом в прошлый раз).
Ответ 2
Это теперь включено в MingW (версия 2013072300). Чтобы включить его, вы должны выбрать пакет pthreads в Менеджере установки MinGW.
![Pthreads package options from MingW Installation Manager]()
Ответ 3
Mutex, по крайней мере, не поддерживается в "Модели нитей: win32" инструментальных средств Mingw-builds. Вы должны выбрать любую из наборов инструментов с помощью "Модель темы: posix". Попробовав несколько версий и ревизий (обе архитектуры i686 и x86_64), я нашел поддержку в x86_64-4.9.2-posix-seh-rt_v3-rev1, являющейся моделью потока, IMO, определяющим фактором.
Ответ 4
Используйте модель потоков POSIX для MINGW:
$ 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
Ответ 5
Я не знаю, работает ли это для всех, но в другом случае вам просто нужно обновить свой ndk. Я использую ndk-r11c, и он отлично работает.
Ответ 6
Я получил ту же ошибку с gcc4.7.7.
После добавления "-std = С++ 0x" он исправлен.
Ответ 7
Я столкнулся с этой же проблемой при использовании MingW-W64 7.2.0. Я протестировал несколько разных сборок Windows со страницы загрузки mingw-64 и обнаружил, что MinGW-W64 GCC-8.1.0 поддерживает mutex
и содержит библиотеку pthread
. При установке я выбрал следующие параметры:
Мой многопоточный код, основанный на pthreads
теперь компилируется и работает без ошибок как в Windows, так и в Linux.
![Installed MingW version on Windows 8.1]()
Эта версия более компактна, чем сборка 7.3.0, которую я использовал, потому что в ней нет среды CygWin или менеджера пакетов. Я также скопировал mingw32-make.exe
в make.exe
чтобы мой Makefile не нуждался в модификации. Установщик создает ссылку "Запустить терминал" в меню "Пуск" Windows.
![Building and running pthread application on Windows 8.1 using MingW]()
Ответ 8
Сегодня я столкнулся с этой ошибкой и исправил ее следующими шагами:
- Проект > Вариант сборки...
- Выбранный по умолчанию компилятор: GNU GCC Compiler
- На вкладке "Параметры компилятора/флаги компилятора" установите флажок
"Пусть g++ соответствует стандарту языка С++ 11 ISO С++ [-std = С++ 11]"
Удачи.
Ответ 9
На windows 7 (64bit) - 2 разных машины, у меня работала эта версия ming64, т.е. std :: mutex не вызывал ошибок компиляции:
https://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win32/Personal%20Builds/mingw-builds/installer/mingw-w64-install.exe/download
Настройки:
Версия: 8.1.0
Архитектура: x86_64
Темы: posix
Исключение: seh
Редакция сборки: 0
Однако версия mingw64 из:
https://sourceforge.net/projects/mingw-w64/
DID вызывает любые ошибки компиляции для std :: mutex.
Итак, очевидно, что есть разница между ними, но что именно я не знаю!
Ответ 10
Многие классы стандартной библиотеки потоков могут быть заменены форматированными. Очень простым решением является изменение всего стандартного файла 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.