#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();
}
РЕДАКТИРОВАТЬ: Учитывая ваши изменения, вы должны сделать это так:
std::thread spawn() {
return std::thread(&blub::test, this);
}
ОБНОВЛЕНИЕ: Я хочу объяснить еще некоторые моменты, некоторые из них также обсуждались в комментариях.
Описанный выше синтаксис определен в терминах определения INVOKE (§20.8.2.1):
Определите INVOKE (f, t1, t2, ..., tN) следующим образом:
- (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 или ссылка на объект
типа, производного от Т;
- (* 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
.