据我了解,在对象内部启动线程时调用的函数不应该是类成员。最好的方法似乎是启动一个朋友功能,它可以让您重新访问您的对象。
通常,启动子线程的成员函数(以及父线程)可以继续,也可以返回。在我使用这种技术的每一种情况下,我都让启动器方法返回到调用它的父线程中的应用程序;类似于 Qt 线程。
当子线程完成它的工作时,它所做的最后一件事是返回到友元函数,该函数本身返回到等待返回的东西(pthread_koin 或 WaitForSingleEvent),或者,如果没有捕手,我猜你会说归于无处。
所以,这就是问题所在。如果友元函数的返回没有捕获器,即父线程不在成员函数中,我可以安全地销毁从友元函数启动子线程的对象吗?
编辑 - - - - - - - - - - - - - - - - - - - - - - - - - -------------------------
从回复中可以看出,我需要一个例子。我们会选择Windows。与Linux没有什么不同。我遗漏了很多东西,类定义等。
- Main 在堆上创建了一个 SomeObject。
- Main 调用 so->run() 并开始做其他事情。
- Run() 启动运行 SomeFriend() 的子线程。
- SomeFriend() 调用 so->Worker() (that == so)
- Worker() 执行任何操作并返回到 SomeFriend()。
- 我可以在这里删除吗?即
delete that
<<<=== 这个问题的主题。 - SomeFriend() 返回终止子线程。
//================================================================= int main( int argc, char** argv ) { SomeObject* so = new SomeObject(); so->run(); while(1) { DoOtherTasks(); // but don't exit! } return 0; //================================================================= void SomeObject::run(); ( volatile DWORD ThreadId; // Thread ID HANDLE threadHandle; try { threadHandle = CreateThread( NULL, // default security attributes 0, // set stack size: default = 0 (LPTHREAD_START_ROUTINE)(SomeFriend), (LPVOID*)this, // func args: this 0, // default creation flags (LPDWORD)(&ThreadId) // ptr to thread identifier ); } catch ( ... ) { throw; } } // launches the thread and returns. //================================================================= void* SomeFriend( void* thisPtr ) // is a friend of SomeObject { SomeObject* that ((SomeObject*)thisPtr); that->Worker(); // HERE IS WHERE THE QUESTION IS TALKING ABOUT // CAN I DO THIS SAFELY? delete that; return (void*)NULL; } //================================================================= void SomeObject::Worker() // remember, this is run in the daughter thread. { // whatever return (void*)NULL; }