从工作线程访问共享数据

时间:2017-02-04 19:21:14

标签: c++ multithreading mfc thread-safety

我有以下代码:

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()中包含垃圾。

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

1 个答案:

答案 0 :(得分:3)

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

要解决这个问题,基本上有两个选择:

  • 创建同步对象(例如CEvent),并在完成读取数据后让工作线程发出信号。在主线程中调用WaitForSingleObject以阻止执行,直到发生这种情况。这可能会遇到死锁,例如:当工人线程死亡时。
  • 更简单的解决方案是使用动态内存管理。使用new分配CWorkerData实例并将地址传递给工作线程。然后,工作线程可以在完成对象时调用delete