gpt4 book ai didi

c++ - 从工作线程访问共享数据

转载 作者:太空狗 更新时间:2023-10-29 21:14:02 24 4
gpt4 key购买 nike

我有以下代码:

void COrganizerProgressDlg::LaunchWorkerThread()
{
CWorkerData data;
data.m_pWndOrganizerProgressDlg = this;
data.m_pWndImageOrganizerDlg = m_pWndImageOrganizerDlg;
::AfxBeginThread(RunBackgroundWorker, &data);
}

这是我的RunBackgroundWorker() 方法,它是一个static 方法。

UINT COrganizerProgressDlg::RunBackgroundWorker(LPVOID pParam)
{
try
{
// Run organizer engine
COrganizerEngine engine(m_nNotifyMessage, (CWorkerData*)pParam);
engine.Run();
}
catch (CException *e)
{
e->ReportError();
e->Delete();
}
return 0;
}

数据正用于初始化我的工作类中的设置。

问题是我的 data 变量在调用 AfxBeginThread() 之前包含有效数据,但似乎在 RunBackgroundWorker() 中包含垃圾。

我错过了什么?我如何从我的工作线程访问这些数据?

最佳答案

data 是一个具有自动存储期限的对象。一旦超出范围,它就不再有效。我假设 data 在工作线程有机会获取信息之前超出范围。

要解决这个问题,基本上有 2 个选项:

  • 创建一个同步对象(例如 CEvent ),并让工作线程在完成读取数据时向其发出信号。调用WaitForSingleObject在主线程中阻止执行直到发生这种情况。这容易出现死锁,例如当工作线程结束时。
  • 一个更简单的解决方案是使用动态内存管理。使用 new 分配一个 CWorkerData 实例并将地址传递给工作线程。工作线程可以调用 delete,只要它完成了对象。

关于c++ - 从工作线程访问共享数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42044580/

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