#include <thread>
#include <iostream>
class bar {
public:
void foo() {
std::cout << "hello from member function" << std::endl;
}
};
int main()
{
std::thread t(&bar::foo, bar());
t.join();
}
EDIT: Учет вашего редактирования, вы должны сделать это следующим образом:
std::thread spawn() {
return std::thread(&blub::test, this);
}
UPDATE: я хочу объяснить несколько пунктов, некоторые из них также обсуждались в комментариях.
Синтаксис, описанный выше, определен в терминах определения INVOKE (§20.8.2.1):
Определить INVOKE (f, t1, t2,. .., tN) следующим образом:
blockquote>
- (t1. * f) (t2, ..., tN), когда f является указателем на функцию-член класса T и t1 является объект типа T или ссылку на объект типа T или ссылку на объект типа, полученного из T;
- ((* t1). * f) (t2, ..., tN ), когда f является указателем на функцию-член класса T и t1 не является одним из типов, описанных в предыдущем пункте;
- t1. * f, когда N == 1 и f является указателем на данные члена класса T и t 1 являются объектами типа T или ссылкой на объект типа T или ссылкой на объект типа, полученного из T;
- (* t1). * f, когда N == 1 и f является указателем на данные элемента класса T и t 1 не является один из типов, описанных в предыдущем пункте:
- f (t1, t2, ..., tN) во всех других случаях.
Еще один общий факт, который я хочу отметить, заключается в том, что по умолчанию конструктор потока копирует все переданные ему аргументы. Причина этого в том, что аргументам может потребоваться пережить вызывающий поток, и копирование аргументов гарантирует это. Вместо этого, если вы хотите действительно передать ссылку, вы можете использовать
std::reference_wrapper
, созданныйstd::ref
.std::thread (foo, std::ref(arg1));
Поступая таким образом, вы обещаете, что будете заботиться о том, чтобы аргументы будут существовать, когда поток работает на них.
Обратите внимание, что все перечисленные выше могут также применяться к
std::async
иstd::bind
.