gpt4 book ai didi

C++ 在子线程中删除

转载 作者:太空宇宙 更新时间:2023-11-04 11:57:03 24 4
gpt4 key购买 nike

我的理解是,在对象内部启动线程时调用的函数不应该是类成员。最好的方法似乎是启动一个友元函数,它可以让您访问回您的对象。

一般来说,启动子线程的成员函数(以及父线程)可以继续或者返回。在我使用这种技术的每一种情况下,我都让启动器方法返回到调用它的父线程中的应用程序;类似于 Qt 线程。

当子线程完成它的工作时,它做的最后一件事是返回到友元函数,它本身返回到等待捕获它的返回的东西(pthread_koin 或 WaitForSingleEvent),或者,如果没有捕获器,我猜你' d 说它无处返回。

所以,问题来了。如果友元函数的返回没有捕获器,即父线程不在成员函数中,我是否可以安全地销毁从友元函数启动子线程的对象?

编辑-------------------------------------------- ------------------------------

从回复中可以明显看出,我需要一个示例。我们将选择 Windows。与 Linux 没有什么不同。我遗漏了很多东西,类定义等。

  1. Main 在堆上创建一个 SomeObject。
  2. Main 调用 so->run() 并去做其他事情。
  3. Run() 启动运行 SomeFriend() 的子线程。
  4. SomeFriend() 调用 so->Worker()(即 == so)
  5. Worker() 做任何事情并返回给 SomeFriend()。
  6. 我可以在这里删除吗?即 删除那个 <<<=== 这个问题的主题。
  7. 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;
}

最佳答案

要回答您编辑过的问题,是的,您可以删除它;但是,请记住 main() 或它调用的任何函数可能没有有效的 ,所以 在其逻辑之后 任何so->run() 被调用是因为线程调度程序可能已经调度的方式线程。

在调用 so->run() 之后,将线程视为“拥有”somain() 及其堆栈后代在没有保护逻辑的情况下不应再次接触 so

关于C++ 在子线程中删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15797694/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com