Я играл с потоком C++ 11 некоторое время и задаю несколько вопросов. Люди говорят, что когда вы вызываете функцию члена класса в потоке, эта функция должна быть static
. Но, похоже, это не так. Например, я нашел это:C++ 11 thread, static или non-static class member function, значение аргументов
class bar
{ public:
void foo() {std::out << "Hello" << std::endl};
}
int main()
{
std::thread t0(&bar::foo, bar());
t0.join();
}
Приведенный выше код работает отлично. Кажется, что функция-член не обязательно должна быть статичной в стандарте C++ 11. Я хочу знать, верно ли мое понимание. Другой вопрос заключается в том, что, если я просто изменить «пустое Foo()» с «статической ничтожной Foo()», я получаю сообщение об ошибке:
error: no type named 'type' in 'class std::result_of<void (*(bar))()>'
Я не понимаю этого, но мне кажется, что это происходит потому, путь, который я называю нитью, неверен. Я очень запутался в вызове функции в потоке. Например, я нашел другой способ назвать ту же функцию-член в приведенном выше примере, как
int main()
{ bar A;
std::thread t0(&bar::foo, &A);
}
Он также работает! Я не знаю разницы между этими двумя способами. Кажется, что в первом случае конструктор класса будет выполняться каждый раз, когда я вызываю foo(), а во втором - нет. Это правда? Кроме того, при вызове функции-члена в другой функции-члене класса, это должно быть передано.
Я ищу в Интернете, все, что я могу найти, это примеры, не объясняя смысла аргументов. Может ли кто-нибудь сказать мне, как мне задать аргументы (особенно первые три) в std::thread
?
Спасибо за ответ! Я проверил, что std :: thread t0 (& bar :: foo) хорошо работает со статической функцией foo(). Так что теперь яснее для меня: поскольку static foo() не имеет указателя 'this', мне нужно только передать адрес функции & bar :: foo, а для нестатического foo() мне нужно также передать адрес объекта. В этом есть смысл! Таким образом, это означает, что с помощью C++ 11 мы можем вызвать нестационарную функцию-член в потоке, правильно? –
@HongkunLi Да, конечно. –