如何通过子成员函数创建线程
How to create a thread by a child member function
我有一个IBase
class和一个Child
class。我需要在不同的子 class 中调用不同的 proc
函数。我不确定下面哪个表格是正确的,也许两者都不是 XD。
- 形式 1:确切地说,我不希望我的
IBase
有任何非虚函数。
- 形式2:有一个奇怪的表达
&IBase::proc
可能会引起一些误解。
class IBase
{
public:
virtual void proc() = 0;
auto createBind()
{
return bind(&IBase::proc, this);
}
};
class Child :public IBase
{
public:
void proc() override
{
cout << "Hello World" << endl;
}
};
int main()
{
IBase* pointer = new Child;
//form 1
thread th(pointer->createBind());
th.join();
//form 2
thread th2(&IBase::proc, pointer);
th2.join();
cout << "Finish" << endl;
return 0;
}
请问各位在实际项目中是如何解决这种情况的
我会使用表格 3 :-) :
thread* th3 = pointer->start();
th3->join();
与 start
在 IBase
中:
thread* start()
{
thread* t = new thread(createBind());
return t;
}
在我看来,这会隐藏更多实施细节并为调用者提供他期望的 API(启动线程)。
最惯用和最健壮的方式可能是这个
std::thread t([=]{pointer->proc();});
没有绑定,没有无关的辅助成员函数,没有奇怪的语法和多余的 class 名称。
我有一个IBase
class和一个Child
class。我需要在不同的子 class 中调用不同的 proc
函数。我不确定下面哪个表格是正确的,也许两者都不是 XD。
- 形式 1:确切地说,我不希望我的
IBase
有任何非虚函数。 - 形式2:有一个奇怪的表达
&IBase::proc
可能会引起一些误解。
class IBase
{
public:
virtual void proc() = 0;
auto createBind()
{
return bind(&IBase::proc, this);
}
};
class Child :public IBase
{
public:
void proc() override
{
cout << "Hello World" << endl;
}
};
int main()
{
IBase* pointer = new Child;
//form 1
thread th(pointer->createBind());
th.join();
//form 2
thread th2(&IBase::proc, pointer);
th2.join();
cout << "Finish" << endl;
return 0;
}
请问各位在实际项目中是如何解决这种情况的
我会使用表格 3 :-) :
thread* th3 = pointer->start();
th3->join();
与 start
在 IBase
中:
thread* start()
{
thread* t = new thread(createBind());
return t;
}
在我看来,这会隐藏更多实施细节并为调用者提供他期望的 API(启动线程)。
最惯用和最健壮的方式可能是这个
std::thread t([=]{pointer->proc();});
没有绑定,没有无关的辅助成员函数,没有奇怪的语法和多余的 class 名称。