gpt4 book ai didi

c++ - 在类构造函数中将此指针传递给 CreateThread 在线程过程中表现得很奇怪

转载 作者:可可西里 更新时间:2023-11-01 09:30:42 24 4
gpt4 key购买 nike

在我的一个类的构造函数中,我调用 Windows 函数 CreateThread作为最后的操作。创建线程以立即执行,我将类的 this 指针作为 lpParameter 传递。 .

在线程过程中,我将传递回的参数转换为我的类的指针并将其命名为 pThis .

我可以看到 pThis指向与 this 相同的内存位置我调用 CreateThread 时传递的指针.但是,如果我查看 pThis->... 访问的成员变量他们都有错误的值(value)观。

我期望 this->member_variable 的值在this指针所属的类中使用的与我在写pThis->member_variable时得到的相同在线程的过程中。

如果我调用 CreateThread在另一个成员函数(不是 构造函数)中一切正常。

因此问题:是否禁止调用 Windows 函数 CreateThread从 C++ 类的构造函数中?如果是,问题是什么?

澄清:

1) 我可以确认该对象始终存在。只有当整个程序结束时,对象才会超出范围。正如我已经说过的:调用 CreateThread来自其他一些成员函数确实有效。

2) 更正了“wired”的拼写错误,应该是“weird”,抱歉。

部分代码:

我尝试发布代码片段,将事情减少到最低限度,同时保留“错误”部分。

class CTimerW32 : public CTimer
{
public:
CTimerW32();
~CTimerW32();

private:
static void CALLBACK TimerCallback(LPVOID lpParam, BOOLEAN bReason);
static DWORD WINAPI WaitCompletition(LPVOID lpParam);

private:
HANDLE m_hCompletitionEvent;
HANDLE m_hCompletitionThread;
bool m_bStartDeferred;
};

您可以安全地忽略基类 CTimer因为它只是一个支持在不同平台上构建的抽象基类。

CTimerW32::CTimerW32()
{
m_bStartDeferred= false;
m_hCompletitionEvent= CreateEvent(NULL, FALSE, FALSE, NULL);
m_hCompletitionThread= CreateThread(NULL, 0, WaitCompletition, this, 0, NULL);
}

在这里我可以看到 m_hCompletitionEvent在调用 CreateEvent 后有效.

DWORD WINAPI CTimerW32::WaitCompletition(LPVOID lpParam)
{
CTimerW32* pThis;
DWORD dwRet;

pThis= (CTimerW32*)(lpParam);

while (true) {
// just wait for the completition event to be signaled
dwRet= WaitForSingleObject(pThis->m_hCompletitionEvent, INFINITE);

// ...
if (pThis->m_bStartDeferred) {
// ...
}
}

此处调用 WaitForSingleObject 时出现问题.如前所述,类 CTimerW32 对象的 this 指针(现在 pThis )在线程创建期间仍然具有与 this 指针相同的值。然而 pThis->m_hCompletitionEvent 中的句柄似乎是随机数据。这不是调用 CreateEvent 后观察到的值在构造函数中。

最佳答案

在构造函数中创建线程应该不是问题。此外,在运行构造函数中的任何代码以创建线程之前,您的对象应该由初始化列表完全初始化,因此初始化可能不是问题。

您正在观察的对象很可能超出范围,并且在您在新线程中观察它之前调用了它的析构函数。尝试使用 new 动态创建对象,看看这种情况是否仍然发生,我敢打赌它不会发生,因为对象在超出范围时不会被销毁。

显然,你应该在更高的范围内保留一个指向这个对象的指针,这样你最终也可以删除它:)

关于c++ - 在类构造函数中将此指针传递给 CreateThread 在线程过程中表现得很奇怪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11654380/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com