#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: Menghitung hasil edit Anda, Anda harus melakukannya seperti ini:
std::thread spawn() {
return std::thread(&blub::test, this);
}
UPDATE: Saya ingin menjelaskan beberapa poin lagi, beberapa dari mereka juga telah dibahas dalam komentar.
Sintaks yang diuraikan di atas didefinisikan dalam istilah definisi INVOKE (§20.8.2.1):
Tentukan INVOKE (f, t1, t2, ..., tN) sebagai berikut:
- (t1. * f) (t2, ..., tN) ketika f adalah penunjuk ke fungsi anggota kelas T dan t1 adalah objek tipe T atau referensi ke objek tipe T atau referensi ke objek jenis yang berasal dari T;
- ((* t1). * f) (t2, ..., tN) ketika f adalah pointer ke fungsi anggota kelas T dan t1 bukan salah satu dari tipe yang dijelaskan dalam item sebelumnya;
- t1. * f ketika N == 1 dan f adalah penunjuk ke data anggota kelas T dan t 1 adalah objek tipe T atau
referensi ke objek tipe T atau referensi ke objek
tipe yang berasal dari T;
- (* t1). * f ketika N == 1 dan f adalah pointer ke data anggota kelas T dan t 1 bukan salah satu dari tipe yang dijelaskan dalam item sebelumnya;
- f (t1, t2, ..., tN) dalam semua kasus lainnya.
Fakta umum lain yang ingin saya tunjukkan adalah bahwa secara default konstruktor utas akan menyalin semua argumen yang diteruskan ke sana. Alasan untuk ini adalah bahwa argumen mungkin perlu hidup lebih lama dari utas panggilan, menyalin argumen menjamin itu. Sebaliknya, jika Anda ingin benar-benar melewati referensi, Anda dapat menggunakan yang std::reference_wrapper
dibuat oleh std::ref
.
std::thread (foo, std::ref(arg1));
Dengan melakukan ini, Anda berjanji bahwa Anda akan memastikan bahwa argumen akan tetap ada ketika utas beroperasi pada mereka.
Perhatikan bahwa semua hal yang disebutkan di atas juga dapat diterapkan ke std::async
dan std::bind
.