Я использую g ++ 4.7 с флагом c ++ 11. В этой демонстрации:
#include <iostream>
#include <thread>
class do_work
{
public:
void operator()()
{
std::cout << "Doing work..." << std::endl;
}
};
void foo()
{
}
int main()
{
// Does not work
std::thread t(do_work);
t.join(); // error: request for member ‘join’ in ‘t’, which is of non-class type ‘std::thread(do_work)’
// Works
std::thread t2(foo);
t2.join();
return 0;
}
Я могу успешно вызвать join () в потоке, который был создан с функцией в качестве аргумента конструктора, но я не могу вызвать join () (см. Встроенную ошибку) в потоке, который был создан с помощью функтора в качестве аргумента конструктора. Кто-нибудь может объяснить это?
Вы объявили t
как функция, принимающая do_work
и возвращаясь std::thread
,
Вы, вероятно, хотите написать
do_work worker;
std::thread t{worker};
или же
std::thread t{do_work{}};
или же
std::thread t((do_work()));
Обратите внимание, что
std::thread t(do_work());
не сработает; его досадно разобрали как объявление функции t
принимая функцию, которая не принимает аргументов и возвращает do_work
и возвращаясь std::thread
, Упаковка do_work
временный с круглыми скобками или с использованием единого синтаксиса инициализатора (в любой момент) это исправит.
Это хорошая причина для того, чтобы по возможности использовать унифицированный синтаксис инициализатора; если бы ты написал
std::thread t{do_work}; // incorrect
тогда компиляция не удалась бы в этой строке вместо join
,
Других решений пока нет …