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.