#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);
}
UPDATE:ฉันต้องการอธิบายเพิ่มเติมบางประเด็นบางส่วนถูกอภิปรายในความคิดเห็นด้วย
ไวยากรณ์ที่อธิบายไว้ข้างต้นมีการกำหนดในแง่ของนิยาม 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 หรือการอ้างอิงไปยังวัตถุ
ประเภทที่ได้มาจาก 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