data_condition wait erreur d’argument invalide

data_cond.wait(lk, [this]{return !data_queue.empty();}); 

argument invalide après compilation avec

 g++ -std=c++0x -Wall -pthread threadpool.cc -o hello 

à l’origine du livre est

 data_cond.wait(lk, []{return !data_queue.empty();}); 

Cela ressemble plutôt au code de mon livre: C ++ Concurrency in Action , en particulier avec l’absence de [this] capture (une faute de frappe qui sera corrigée lors de l’impression finale).

Malheureusement, il existe un bogue dans g ++ 4.5 et 4.6, dans lequel le compilateur ne peut pas gérer les lambdas avec [this] capture dans les modèles de classe. Cela s’applique même aux modèles simples. Vous pouvez voir le problème avec les classes simples ci-dessous:

 struct X { int i; void foo() { [this] { ++i; }; } }; template struct Y { T i; void foo() { [this] { ++i; }; } }; 

Les deux g ++ 4.5 et g ++ 4.6 donneront des erreurs “invalid type argument” sur le lambda dans Y::foo , mais accepteront le même code dans X::foo .

Espérons que cela sera corrigé dans une future version de g ++. En attendant, je suggérerais d’utiliser un explicite autour de l’appel d’ wait :

 while(data_queue.empty()) { data_cond.wait(lk); } 

À moins que data_queue soit un membre de données non statique de l’instance de classe actuelle et que vous appeliez cette ligne de code à partir d’une méthode de classe non statique, il n’est pas nécessaire de tenter de capturer le pointeur this . Si vous essayez d’appeler votre code à l’intérieur d’une fonction qui est une fonction autonome indépendante ou une méthode de classe statique, il n’y aura pas de pointeur à capturer, et vous allez vous retrouver avec un erreur d’argument invalide. Le fait que le livre que vous référencez utilise un lambda sans état (c’est-à-dire qu’il n’y a pas de variables capturées entre crochets) m’implique que vous tentez d’effectuer une opération non nécessaire ou impossible selon le contexte du code.