Подтвердить что ты не робот

Как включить экспериментальные возможности С++ 11 concurrency в MinGW?

При попытке скомпилировать следующий код

#include <thread>
#include <iostream>

void foo() { std::cout << "foo\n"; }

int main()
{
  std::thread t(foo);
  t.join();
}

Я получаю сообщение об ошибке:

C:\Test>g++ -g -Wall -lpthread -std=c++0x
main.cpp
main.cpp: In function 'int main()':
main.cpp:12:2: error: 'thread' is not a member of 'std'
main.cpp:12:14: error: expected ';' before 't'
main.cpp:13:2: error: 't' has not been declared

Как использовать экспериментальные функции С++ 11 concurrency? У меня есть MinGW GCC 4.5.1 (TDM)

EDIT: BTW, Visual Studio 2012 отлично выполняет этот пример кода.

4b9b3361

Ответ 1

Насколько мне известно, MinGW еще не поддерживает новые функции С++ 0x concurrency (как в GCC 4.5). Я помню, как читал обмен списком рассылки, в котором указывалось, что в MinGW следующий ifdef из заголовка потока не выполняется:

#if defined(_GLIBCXX_HAS_GTHREADS)

Я предполагаю, что это как-то связано с тем, как MinGW создается под Windows, независимо от того, использует ли он собственные потоки или pthread и т.д. В моем коде я написал некоторую минимальную упаковку, которая использует Boost.thread вместо native С++ 0x, когда в Windows. Эти два интерфейса очень похожи, и для многих применений они могут быть заменены без проблем.

РЕДАКТИРОВАТЬ: благодаря Люку Дантону, чтобы выкопать поток списка рассылки, упомянутый выше:

http://comments.gmane.org/gmane.comp.gnu.mingw.user/33065

Ответ 2

В настоящее время я работаю над сбором GCC, который использует новую библиотеку winpthreads mingw-w64. Это позволило бы создать модель потоковой резьбы в GCC, и в настоящее время ведется работа над тем, чтобы она работала так, как должна. Другой пользователь mingw-w64 уже получил это функционирование, взломав (разумно), но я пытаюсь сделать это в mainline GCC без ручного вмешательства после установки инструментальной цепочки.

В настоящем обсуждении можно следовать здесь. Я обновлю этот ответ, как только все грубые края будут сглажены.

РЕДАКТИРОВАТЬ. Из-за повышенного значения этот ответ пришел к моему вниманию. Я создал экспериментальный GCC 4.7, который должен работать с std::thread, но только при связывании статически (добавьте -static в ссылку). Объявление здесь.

Ответ 3

Страница статуса библиотеки С++ 0x говорит, что она была реализована, но вам может понадобиться версия SVN, чтобы получить все, что указано на этой странице, Эта страница выглядит так, что это поможет вам получить сборку кровотечений.

Ответ 4

Как отмечали другие, порт mccw gcc не предоставляет поддержку С++ 0x concurrency из коробки. Тем не менее, коммерческая just:: thread library предоставляет эти возможности, поэтому вы можете использовать std::thread с TDM/mingw порт gcc 4.5.2.

Отказ от ответственности: я являюсь основным разработчиком библиотеки just:: thread.

Ответ 5

Уже существует легкая нативная реализация std:: threads и примитивов синхронизации: https://github.com/meganz/mingw-std-threads

Это библиотека только для заголовков, и она должна работать с любой версией MinGW на С++ 11.

Ответ 6

Когда вы получаете компилятор, который поддерживает std::thread, вот ваш исправленный пример (два младших типа-o):

#include <thread>
#include <iostream>

void foo() { std::cout << "foo\n"; }

int main()
{
  std::thread t(foo);
  t.join();
}

Ответ 7

Попробуйте создать MinGw:

http://sourceforge.net/projects/mingwbuilds/

Этот установщик позволит вам выбрать любую MinGW, которую вы хотите, а также включает в себя функции потока С++ 11.

Ответ 8

Существует еще один вариант.

//Threading01.cpp

#include <thread>
#include <iostream>

void hello()
{
    std::cout<< "Hello Threading ..." << std::endl;
}

int main()
{
    std::thread t1(hello);
    t1.join();

    return 0;
}

Загрузите mingw-w64 (Проект mingw-w64 на sourceforge.net перемещается в mingw-w64.org) и выполните файл .bat(mingw-w64.bat), который они предоставили. В предоставленной командной строке вы можете выполнить свой код потока, как этот

C:\CPP>g++ std=c++11 -g -Wall -lpthread -o Threading01 Threading01.cpp