С++ мьютекс в пространстве имен std не называет тип - программирование

С++ мьютекс в пространстве имен 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.

Почему я получаю эту ошибку? Разве компилятор не поддерживает использование блокировок?

4b9b3361

Ответ 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. При установке я выбрал следующие параметры:

  • x86_64
  • POSIX
  • SEH

Мой многопоточный код, основанный на 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.