2015-06-08 5 views
-1

Я играл с потоком 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?

ответ

1

std::thread t0(&bar::foo) работает довольно хорошо со статическими foo метод.

Кроме того, задавая вопрос рассмотреть, чтобы обеспечить рабочий код, но не ваш текста то, что вы на самом деле написали только сейчас прямо в текстовом поле этого сайта.

Короткий ответ на ваш вопрос: укажите параметр нестационарных методов класса или не предоставляйте его, если он является методом статического класса.

Но если вы не понимаете, что вы должны знать одно: каждый метод класса работает с объектом this, что означает постоянный указатель на текущий объект. При привязке вашей функции (я предполагаю, что именно привязка работает внутри std::thread) первым параметром должен быть объект, какой метод вы хотите вызвать. В противном случае это бессмысленно: вы пытаетесь что-то сделать с каким-то объектом? существует в каждом нестационарном методе класса, неявно, по первому параметру метода.

Я рекомендую вам прочитать the definitive c++ stackoverflow book guide and list

+0

Спасибо за ответ! Я проверил, что std :: thread t0 (& bar :: foo) хорошо работает со статической функцией foo(). Так что теперь яснее для меня: поскольку static foo() не имеет указателя 'this', мне нужно только передать адрес функции & bar :: foo, а для нестатического foo() мне нужно также передать адрес объекта. В этом есть смысл! Таким образом, это означает, что с помощью C++ 11 мы можем вызвать нестационарную функцию-член в потоке, правильно? –

+0

@HongkunLi Да, конечно. –