线程已创建但未执行
Thread is created but not executed
我有一个 ATL-COM 组件使用的 DLL。在我的 DLL 中,从 FinalConstruct 调用了 StartMonitoring 方法。我想在 StartMonitoring() 中创建后台线程,但线程已创建且有效句柄已 returned 但线程中的代码从未执行。这是否与 ATL 组件的工作方式有关?如果这是一个愚蠢的问题,请原谅,但我没有任何 ATL/COM 理解。
我认为这与 COM 的工作方式有关。在我的例子中,我需要 StartMonitoring 来启动后台线程,当从 FinalRelease() 调用 StopMonitoring 时,将发出该后台线程退出的信号,然后等待它退出。现在因为线程没有启动但已经给出了一个有效的句柄,StopMonitoring 将发出信号并永远等待。如果我通过绕过 Wait 和 return 到 FinalRelease() 强行结束 StopMonitoring,MonitorThreadProc 然后开始执行。
unsigned int WINAPI CMonitor::MonitorThreadProc(LPVOID lpvParam)
{
std::cout << "Enter MonitorThreadProc" << endl; //Never hits this
if (lpvParam == nullptr)
return 1;
CMonitor *pMonitor = static_cast<CMonitor*>(lpvParam);
return (unsigned int)pMonitor->Run();
}
void CMonitor::StopMonitoring()
{
if(m_EvtReg)
{
m_EvtStopMonitoring.Set();
DWORD dwResult = ::WaitForSingleObject(m_hThread, INFINITE);
if(dwResult == WAIT_OBJECT_0)
{
cout<<"Thread terminated"<<endl;
}
}
m_EvtReg.Close();
m_EvtStopMonitoring.Close();
HANDLE h = m_hThread.Detach();
CloseHandle(h);
}
bool CMonitor::StartMonitoring()
{
int num = 0;
unsigned int nThreadId = 0;
HANDLE hThread = (HANDLE)_beginthreadex(nullptr, 0, MonitorThreadProc, (LPVOID)this, 0, &nThreadId);
if(hThread == nullptr)
{
return false;
}
//I get a valid handle from _beginthreadex, but the thread never gets executed.
m_hThread.Attach(hThread);
return true;
}
奇怪的行为是由于在 DLL 加载期间持有加载程序锁。在加载程序锁被持有之前,线程永远不会被调度,因此我没有看到代码执行。
我有一个 ATL-COM 组件使用的 DLL。在我的 DLL 中,从 FinalConstruct 调用了 StartMonitoring 方法。我想在 StartMonitoring() 中创建后台线程,但线程已创建且有效句柄已 returned 但线程中的代码从未执行。这是否与 ATL 组件的工作方式有关?如果这是一个愚蠢的问题,请原谅,但我没有任何 ATL/COM 理解。
我认为这与 COM 的工作方式有关。在我的例子中,我需要 StartMonitoring 来启动后台线程,当从 FinalRelease() 调用 StopMonitoring 时,将发出该后台线程退出的信号,然后等待它退出。现在因为线程没有启动但已经给出了一个有效的句柄,StopMonitoring 将发出信号并永远等待。如果我通过绕过 Wait 和 return 到 FinalRelease() 强行结束 StopMonitoring,MonitorThreadProc 然后开始执行。
unsigned int WINAPI CMonitor::MonitorThreadProc(LPVOID lpvParam)
{
std::cout << "Enter MonitorThreadProc" << endl; //Never hits this
if (lpvParam == nullptr)
return 1;
CMonitor *pMonitor = static_cast<CMonitor*>(lpvParam);
return (unsigned int)pMonitor->Run();
}
void CMonitor::StopMonitoring()
{
if(m_EvtReg)
{
m_EvtStopMonitoring.Set();
DWORD dwResult = ::WaitForSingleObject(m_hThread, INFINITE);
if(dwResult == WAIT_OBJECT_0)
{
cout<<"Thread terminated"<<endl;
}
}
m_EvtReg.Close();
m_EvtStopMonitoring.Close();
HANDLE h = m_hThread.Detach();
CloseHandle(h);
}
bool CMonitor::StartMonitoring()
{
int num = 0;
unsigned int nThreadId = 0;
HANDLE hThread = (HANDLE)_beginthreadex(nullptr, 0, MonitorThreadProc, (LPVOID)this, 0, &nThreadId);
if(hThread == nullptr)
{
return false;
}
//I get a valid handle from _beginthreadex, but the thread never gets executed.
m_hThread.Attach(hThread);
return true;
}
奇怪的行为是由于在 DLL 加载期间持有加载程序锁。在加载程序锁被持有之前,线程永远不会被调度,因此我没有看到代码执行。