Как включить экспериментальные функции параллелизма C ++ 11 в MinGW? - PullRequest
22 голосов
/ 09 мая 2011

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

#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

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

РЕДАКТИРОВАТЬ: Кстати, Visual Studio 2012 хорошо работает этот пример кода.

Ответы [ 8 ]

14 голосов
/ 09 мая 2011

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

#if defined(_GLIBCXX_HAS_GTHREADS)

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

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

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

5 голосов
/ 14 июня 2011

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

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

4 голосов
/ 14 июня 2011

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

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

4 голосов
/ 09 мая 2011

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

3 голосов
/ 11 декабря 2014

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

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

2 голосов
/ 09 мая 2011

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

#include <thread>
#include <iostream>

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

int main()
{
  std::thread t(foo);
  t.join();
}
1 голос
/ 09 октября 2013

Попробуйте сборки MinGw:

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

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

0 голосов
/ 18 октября 2014

Есть еще один вариант.

//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
...