线程例程函数中未调用局部变量析构函数?
Local variable destructor not invoked in thread routine function?
我用 vs2013 编写了简单的代码,但运行起来很奇怪:
#include <Windows.h>
#include <process.h>
#include <stdio.h>
#include <cstdint>
#include <tchar.h>
class A
{
public:
explicit A(uint8_t byte) : mByte(byte) {}
~A() { _tprintf(_T("A::~A(%x)\n"), mByte); }
private:
uint8_t mByte;
};
unsigned WINAPI threadRoutine(void*)
{
A a0(0x41);
_endthreadex(0);
return 0;
}
int _tmain(int argc, TCHAR *argv[])
{
HANDLE hThread = (HANDLE)_beginthreadex(NULL, 0, threadRoutine, NULL, 0, NULL);
WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread);
return 0;
}
输出为空,这意味着没有为局部变量 a0 调用 A-dtor?
我的代码中有什么错误吗?
如果在函数后未调用局部变量析构函数,如何在线程例程函数中维护 RAII returns?
_endthread
和 _endthreadex
在线程 returns 从例程传递到 _beginthread
或 _beginthreadex
后自动调用。
您可以显式调用它们来结束线程,但您不必这样做。
对 _endthread
和 _endthreadex
的调用导致它们终止的线程上挂起的 C++ 析构函数不被调用。
来源:MSDN
我用 vs2013 编写了简单的代码,但运行起来很奇怪:
#include <Windows.h>
#include <process.h>
#include <stdio.h>
#include <cstdint>
#include <tchar.h>
class A
{
public:
explicit A(uint8_t byte) : mByte(byte) {}
~A() { _tprintf(_T("A::~A(%x)\n"), mByte); }
private:
uint8_t mByte;
};
unsigned WINAPI threadRoutine(void*)
{
A a0(0x41);
_endthreadex(0);
return 0;
}
int _tmain(int argc, TCHAR *argv[])
{
HANDLE hThread = (HANDLE)_beginthreadex(NULL, 0, threadRoutine, NULL, 0, NULL);
WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread);
return 0;
}
输出为空,这意味着没有为局部变量 a0 调用 A-dtor?
我的代码中有什么错误吗?
如果在函数后未调用局部变量析构函数,如何在线程例程函数中维护 RAII returns?
_endthread
和 _endthreadex
在线程 returns 从例程传递到 _beginthread
或 _beginthreadex
后自动调用。
您可以显式调用它们来结束线程,但您不必这样做。
对 _endthread
和 _endthreadex
的调用导致它们终止的线程上挂起的 C++ 析构函数不被调用。
来源:MSDN