删除线程时崩溃
Crash when thread is deleted
我正在使用MFC开发应用程序。UI线程启动工作线程并在应用程序关闭时将其停止。问题是,每次尝试删除线程时,该应用程序都在崩溃。
这是代码:
首先是线程类及其实现:
class FileThread : public CWinThread
{
public:
static FileThread* CreateWorkerThread(LPVOID params, UINT priority, UINT flags);
void InitThread();
void StopThread();
inline HANDLE GetStopHandle() const { return m_stopThread; }
inline HANDLE GetWaitHandle() const { return m_waitThread; }
private:
HANDLE m_stopThread;
HANDLE m_waitThread;
FileThread(): m_stopThread(NULL), m_waitThread(NULL) { }
static UINT MyThreadProc(LPVOID pParam);
};
FileThread* FileThread::CreateWorkerThread(LPVOID params, UINT priority, UINT flags)
{
return (FileThread*) AfxBeginThread(FileThread::MyThreadProc, params, priority, 0, flags);
}
void FileThread::InitThread()
{
m_stopThread = CreateEvent(0, TRUE, FALSE, 0);
m_waitThread = CreateEvent(0, TRUE, FALSE, 0);
}
void FileThread::StopThread()
{
::SetEvent(m_stopThread);
::WaitForSingleObject(m_waitThread, INFINITE);
::CloseHandle(m_stopThread);
::CloseHandle(m_waitThread);
}
UINT FileThread::MyThreadProc(LPVOID pParam)
{
ThreadData* pLink = (ThreadData*)pParam;
BOOL continueProcess = TRUE;
int returnCode = EXITCODE_SUCCESS;
while (continueProcess)
{
if(::WaitForSingleObject(pLink->pMe->GetStopHandle(), 0) == WAIT_OBJECT_0)
{
::SetEvent(pLink->pMe->GetWaitHandle());
continueProcess = FALSE;
}
// the thread is looking for some files...
}
delete pLink; // it was allocated from the UI thread
return returnCode;
}
然后,我在哪里开始线程:
ThreadData * td = new ThreadData();
m_myFileThread = FileThread::CreateWorkerThread((LPVOID)td, THREAD_PRIORITY_LOWEST, CREATE_SUSPENDED);
td->pMe = m_myFileThread;
m_myFileThread->m_bAutoDelete = FALSE;
m_myFileThread->InitThread();
m_myFileThread->ResumeThread();
最后,停止(和崩溃):
DWORD exitCode;
if (m_myFileThread != NULL && GetExitCodeThread(m_myFileThread->m_hThread, &exitCode) && (exitCode == STILL_ACTIVE))
{
m_myFileThread->StopThread();
if(::WaitForSingleObject(m_myFileThread->m_hThread, 5000) == WAIT_TIMEOUT)
{
TerminateThread(m_myFileThread->m_hThread, EXITCODE_ABORT);
}
}
if (m_myFileThread != NULL)
{
delete m_myFileThread; // => CRASH
}
看来,我试图删除已经删除的东西,并最终造成巨大的腐败。我试图将M_bautodelete设置为TRUE,而不是我自己删除线程(当程序试图调用AfxendThread时)。
)。线程终止其线程Proc并返回出口代码。
在我看来,这里有一个问题:
FileThread* FileThread::CreateWorkerThread(LPVOID params, UINT priority,
UINT flags)
{
return (FileThread*) AfxBeginThread(FileThread::MyThreadProc, params,
priority, 0, flags);
}
AfxBeginThread
返回 CWinthread*
,因此仅将其施放到您自己的派生类中并不能使其成为该派生类的实例。我很惊讶它完全有效。
而不是从CWinThread
派生FileThread
,而是在包装器类中持有CWinthread*
成员变量,并在必要时通过访问器曝光线索。
相关文章:
- CoInitialize()在单独的线程上崩溃而不返回
- 为什么我的多线程作业队列崩溃
- C/C++ Linux 上的多线程服务器/客户端崩溃
- ZeroMQ 在使用 std::thread 创建工作线程时崩溃
- 使用-static libstdc++时std::线程弱,因此在运行时会导致崩溃
- Qt-工作线程崩溃时将cv::Mat转换为QImage
- 在官方 ZeroMQ 多线程示例的修改版本中崩溃
- 在提升时不一致崩溃::线程::release_handle?
- C 多线程崩溃应用程序
- 在 Unity 中C++使用后台线程进行图像处理会导致崩溃
- C++线程的向量在连接时随机崩溃
- Malloc()/free()在Windows上的几个线程中崩溃
- 使用多线程崩溃
- C++多线程应用程序崩溃
- 使用OpenSSL和锁随机崩溃的多线程程序
- 如何重新启动崩溃的线程
- C++无锁队列与多个线程一起崩溃
- winsock连接调用崩溃如果多个线程运行,则在一个线程中正常工作
- 使用第二个线程快速更新 GUI 窗口会通过调整窗口大小或移动窗口而崩溃
- CUDA内核无缘无故地使用20K 线程崩溃