#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: Kế toán chỉnh sửa của bạn, bạn phải làm như thế này:
std::thread spawn() {
return std::thread(&blub::test, this);
}
CẬP NHẬT: Tôi muốn giải thích thêm một số điểm, một số trong số họ cũng đã được thảo luận trong các ý kiến.
Cú pháp được mô tả ở trên được định nghĩa theo định nghĩa của INVOKE (§20.8.2.1):
Xác định INVOKE (f, t1, t2, ..., tN) như sau:
- (t1. * f) (t2, ..., tN) khi f là con trỏ tới hàm thành viên của lớp T và t1 là một đối tượng thuộc loại T hoặc tham chiếu đến một đối tượng thuộc loại T hoặc tham chiếu đến một đối tượng đối tượng của một loại có nguồn gốc từ T;
- ((* t1). * f) (t2, ..., tN) khi f là con trỏ tới hàm thành viên của lớp T và t1 không phải là một trong các loại được mô tả trong mục trước;
- t1. * f khi N == 1 và f là con trỏ tới dữ liệu thành viên của lớp T và t 1 là đối tượng thuộc loại T hoặc
tham chiếu đến đối tượng thuộc loại T hoặc tham chiếu đến đối tượng của a
loại có nguồn gốc từ T;
- (* t1). * f khi N == 1 và f là con trỏ tới dữ liệu thành viên của lớp T và t 1 không phải là một trong các loại được mô tả trong mục trước;
- f (t1, t2, ..., tN) trong tất cả các trường hợp khác.
Một thực tế chung khác mà tôi muốn chỉ ra là theo mặc định, hàm tạo của luồng sẽ sao chép tất cả các đối số được truyền cho nó. Lý do cho điều này là các đối số có thể cần tồn tại lâu hơn chuỗi gọi, sao chép các đối số đảm bảo điều đó. Thay vào đó, nếu bạn muốn thực sự vượt qua một tài liệu tham khảo, bạn có thể sử dụng một tài liệu std::reference_wrapper
được tạo bởi std::ref
.
std::thread (foo, std::ref(arg1));
Bằng cách này, bạn hứa rằng bạn sẽ đảm bảo rằng các đối số sẽ vẫn tồn tại khi luồng hoạt động trên chúng.
Lưu ý rằng tất cả những điều được đề cập ở trên cũng có thể được áp dụng cho std::async
và std::bind
.