【问题标题】:Local variable destructor not invoked in thread routine function?线程例程函数中未调用局部变量析构函数?
【发布时间】:2015-02-06 13:24:55
【问题描述】:

我用 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?

【问题讨论】:

  • 您无需显式调用_endthreadex()。让函数正常终止即可。
  • 我建议你使用std::thread 而不是编译器特定的方法。
  • @AndyProwl 你应该这样回答。
  • 添加了一个答案,因为 cmets 并不是永久性的——这样看这个问题的人可能会找到答案。如果您改变主意,我很乐意删除我的回答。
  • @kvv 至少,在发布到 SO 之前,您绝对应该重新阅读手册。

标签: c++ multithreading winapi


【解决方案1】:

_endthread_endthreadex 在线程从传递给_beginthread_beginthreadex 的例程返回后自动调用。

可以显式调用它们来结束线程,但您不必这样做。

_endthread_endthreadex 的调用会导致在它们终止的线程上挂起的C++ 析构函数不会被调用。

来源:MSDN

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多