#c #concurrency
#c #параллелизм
Вопрос:
data_cond.wait(lk, [this]{return !data_queue.empty();});
недопустимый аргумент после компиляции с
g -std=c 0x -Wall -pthread threadpool.cc -o hello
первоначально из книги
data_cond.wait(lk, []{return !data_queue.empty();});
Комментарии:
1. Можете ли вы хотя бы показать нам ошибки?
Ответ №1:
Это похоже на код из моей книги: параллелизм C в действии, особенно с отсутствием [this]
захвата (опечатка, которая будет исправлена при окончательной печати).
К сожалению, в g 4.5 и 4.6 есть ошибка, из-за которой компилятор не может обрабатывать лямбды с [this]
захватами в шаблонах классов. Это относится даже к простым шаблонам. Вы можете увидеть проблему с простыми классами ниже:
struct X
{
int i;
void foo() {
[this] { i; };
}
};
template<typename T>
struct Y
{
T i;
void foo() {
[this] { i; };
}
};
Оба g 4.5 и g 4.6 выдадут ошибки «недопустимый аргумент типа» в лямбда Y::foo
-выражении, но с радостью примут тот же код X::foo
.
Надеюсь, это будет исправлено в будущей версии g . В то же время я бы предложил использовать явный вокруг wait
вызова:
while(data_queue.empty())
{
data_cond.wait(lk);
}
Комментарии:
1. это именно из вашей книги
Ответ №2:
Если data_queue
это не нестатический элемент данных текущего экземпляра класса, и вы вызываете эту строку кода из нестатического метода класса, нет необходимости пытаться захватить this
указатель. Если вы пытаетесь вызвать свой код внутри функции, которая является либо независимой автономной функцией, либо методом статического класса, тогда не будет никакого this
указателя для захвата, и вы получите ошибку недопустимого аргумента. Тот факт, что в книге, на которую вы ссылаетесь, используется лямбда-выражение без состояния (т. Е. Внутри скобок Нет захваченных переменных), подразумевает для меня, что вы пытаетесь выполнить операцию, которая либо не является необходимой, либо невозможна в зависимости от контекста кода.
Комментарии:
1. независимо от того, есть это или нет, все равно есть ошибка, где ошибка в коде?
2. Извините, если причина не в этом, тогда вам придется показать больше кода и ошибок. Я не могу читать мысли.