7
votes

GCC 4.7.1 apporte-t-il des threads de support?

J'ai suivi l'instruction ici sur la configuration de la configuration de codeBLOCKS pour utiliser GCC 4.7.1 .L'ontillage fourni à la page I mentionné est bien compilé, mais lorsque j'ai essayé de compiler le code suivant, il a généré les erreurs après.Je Doit dire que j'ai même réglé le drapeau Compilit C ++ 11 via les paramètres du compilateur (-STD = C ++ 11) mais toujours pas de chance. Code qui ne compile pas:

 main.cpp||In function 'int main()':|
 main.cpp|13|error: 'thread' is not a member of 'std'|
 main.cpp|13|error: 'thread' is not a member of 'std'|
 main.cpp|13|error: template argument 1 is invalid|
 main.cpp|13|error: template argument 2 is invalid|
 main.cpp|13|error: invalid type in declaration before ';' token|
 main.cpp|19|error: request for member 'push_back' in 'th', which is of non-class type 'int'|
 main.cpp|19|error: 'thread' is not a member of 'std'|
 main.cpp|23|error: no matching function for call to 'begin(int&)'|
 main.cpp|23|note: candidates are:|
 \include\c++\4.7.1\initializer_list|89|note: template<class _Tp> constexpr const _Tp* std::begin(std::initializer_list<_Tp>)|
 \include\c++\4.7.1\initializer_list|89|note:   template argument deduction/substitution failed:|
 main.cpp|23|note:   mismatched types 'std::initializer_list<_Tp>' and 'int'|
 \include\c++\4.7.1\bits\range_access.h|87|note: template<class _Tp, unsigned int _Nm> _Tp* std::begin(_Tp (&)[_Nm])|
 \include\c++\4.7.1\bits\range_access.h|87|note:   template argument deduction/substitution failed:|
 main.cpp|23|note:   mismatched types '_Tp [_Nm]' and 'int'|
 \include\c++\4.7.1\bits\range_access.h|58|note: template<class _Container> decltype (__cont.begin()) std::begin(const _Container&)|
 \include\c++\4.7.1\bits\range_access.h|58|note:   template argument deduction/substitution failed:|
 main.cpp|23|required from here|
 \include\c++\4.7.1\bits\range_access.h|58|error: request for member 'begin' in '__cont', which is of non-class type 'const int'|
 \include\c++\4.7.1\bits\range_access.h|48|note: template<class _Container> decltype (__cont.begin()) std::begin(_Container&)|
 \include\c++\4.7.1\bits\range_access.h|48|note:   template argument deduction/substitution failed:|
 main.cpp|23|required from here|
 \include\c++\4.7.1\bits\range_access.h|48|error: request for member 'begin' in '__cont', which is of non-class type 'int'|
 main.cpp|23|error: no matching function for call to 'end(int&)'|
 main.cpp|23|note: candidates are:|
 \include\c++\4.7.1\initializer_list|99|note: template<class _Tp> constexpr const _Tp* std::end(std::initializer_list<_Tp>)|
 \include\c++\4.7.1\initializer_list|99|note:   template argument deduction/substitution failed:|
 main.cpp|23|note:   mismatched types 'std::initializer_list<_Tp>' and 'int'|
 \include\c++\4.7.1\bits\range_access.h|97|note: template<class _Tp, unsigned int _Nm> _Tp* std::end(_Tp (&)[_Nm])|
 \include\c++\4.7.1\bits\range_access.h|97|note:   template argument deduction/substitution failed:|
 main.cpp|23|note:   mismatched types '_Tp [_Nm]' and 'int'|
 \include\c++\4.7.1\bits\range_access.h|78|note: template<class _Container> decltype (__cont.end()) std::end(const _Container&)|
 \include\c++\4.7.1\bits\range_access.h|78|note:   template argument deduction/substitution failed:|
 main.cpp|23|required from here|
 \include\c++\4.7.1\bits\range_access.h|78|error: request for member 'end' in '__cont', which is of non-class type 'const int'|
 \include\c++\4.7.1\bits\range_access.h|68|note: template<class _Container> decltype (__cont.end()) std::end(_Container&)|
 \include\c++\4.7.1\bits\range_access.h|68|note:   template argument deduction/substitution failed:|
 main.cpp|23|required from here|
 \include\c++\4.7.1\bits\range_access.h|68|error: request for member 'end' in '__cont', which is of non-class type 'int'|
 main.cpp|23|error: unable to deduce 'auto&' from '<expression error>'|
||=== Build finished: 14 errors, 4 warnings (0 minutes, 6 seconds) ===|


8 commentaires

Sur Unix oui, mais avec Mingw sous Windows no.


Exactement. GCC probablement implémenté std :: thread sur pthread S, ce qui signifie qu'ils ne fonctionnent pas sur les threads Windows Win32. Obtenez un système UNIX.


Oui, sur Linux, il s'appuie sur Pthread. BTW Cela signifie que, sur Linux, vous devez également ajouter un indicateur de liaison -LPTthread à la ligne de commande. Sinon, il sera compilé, mais ne liez pas ou ne produisez pas d'erreurs de temps d'exécution.


@Jogojapan Je pense qu'il est recommandé d'utiliser l'option -pthread , au moins sur Linux.


@juanchopanza Vous voulez dire que c'est recommandé, mais pas nécessaire? Désolé, je ne comprends pas comment votre déclaration est différente de la mienne. (J'ai fait cette déclaration parce que cela n'a pas été mentionné dans les drapeaux du compilateur que l'OP a donné, ce qui pourrait induire les autres personnes, qui utilisent des threads sur Linux plutôt que Mingw / Windows.)


@jogojapan -pthread a fait plus que le lien de liberbthead, mais je ne me souviens pas maintenant de quoi exactement "plus".


@juanchopanza ah. J'ai compris. -Pthread plutôt que -LPThread . Oui, tu as raison. J'aurais dû dire -pthread .


@ Jogojapan, @ Juanchopanza: Il existe une pertinence donc question .


3 Réponses :


7
votes

avec MINGW, le support de thread de GCC dépend de la construction que vous obtenez. Certaines constructions ne soutiennent pas les threads, d'autres.

Je crois que la construction Mingw à http://code.google.com / p / mingw-builds / téléchargements / liste prend en charge les threads.


4 commentaires

Que vous mais lequel dois-je télécharger? I686 versions ou x86-x64? J'utilise des fenêtres 32bits au fait.


@Hossein: Ensuite, obtenez I686. L'autre est 64 bits.


Project Mingw-Builds a été déplacé sur sourceforge.net/projects/mingwbuilds/files/windows-host ici Vous pouvez trouver des versions de Newst de Mingw


@Anthonywilliams: Merci beaucoup, j'ai fait comme on m'a dit et tout va bien;)



2
votes

MINGW ne compilera tout simplement pas avec '-Std = c ++ 0x'. Assez étrange, '-std = gnu ++ 0x' fonctionne.


0 commentaires

0
votes

Essayez Mingw Builds:

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

Ce programme d'installation vous permettra de choisir quel que soit MINGW que vous souhaitez et inclut également C ++ 11 FLIENTALITÉ.


0 commentaires