我需要创建一个应该在类存在的持续时间内运行的线程。线程应该与类一起销毁。使用这种通用设计(加入析构函数)进行编码是否明智?我应该使用分离的线程吗?
class A {
public:
A() { pthread_create(m_thread, ...); }
~A() { pthread_join(m_thread, ...); }
private:
pthread_t m_thrad;
};
最后,我可以使用成员函数来生成线程,还是必须是静态或全局函数?
答案 0 :(得分:4)
如果从线程中访问A类中的数据,则必须将其加入析构函数中。一个分离的线程否则会在它被销毁之后访问类数据,这只是未定义的行为。
您的线程功能必须是静态的或全局的。但是你可以将你的类'this指针作为arg参数传递给pthread_create并将static_cast传递回你的线程main函数并在你的类上调用一个普通的方法。所以你有一个非常纤薄的静态功能:
class X {
public:
X() {
pthread_create(m_thread, 0, ThreadStart, this);
}
private:
static void *ThreadStart(void *arg) {
static_cast<X *>(arg)->ThreadMain();
return 0;
}
void ThreadMain() {
}
.
.
.
};
答案 1 :(得分:0)
我认为这取决于A
类的内容。如果您确定线程将在A
类的实例死后很快退出,那么我猜您可以使用分离的线程。否则我认为你应该通知线程它应该退出并等待它这样做。