#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 або посилання на об’єкт типу, похідного від Т;
- ((* 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
.