gpt4 book ai didi

c++ - WaitForSingleObject 问题

转载 作者:可可西里 更新时间:2023-11-01 11:37:52 27 4
gpt4 key购买 nike

先仔细阅读问题。

有一个从 CTest 类的 CreateInstance 生成的工作线程。这是该类的原型(prototype)。 hThread 是线程句柄,hEventShutdown 是程序退出时用于关闭线程的事件。 WaitForShutdown 是用于向 hEventShutdown 发出信号并等待线程句柄直到线程正常退出的公共(public)函数。 WaitForShutdown 在应用程序退出时被调用。

//pseudocode
CTest
{
public:
CTest* CreateInstance();
static threadproc(void *pv);
void WaitForShutdown();

public:
HANDLE hThread;
HANDLE hEventShutdown;

}

void CTest::CTest* CreateInstance()
{
// spawn a thread, pass 'this' pointer to thread , use beginthreadex

hThread = beginthreadex ( threadproc, this );
}


unsigned int CTest::threadproc( void *pv)
{

Ctest *ptest = (Ctest*)pv;

do
{
HANDLES hArray[2] = { pv->hEventShutdown, someotherhandle }

dwResult = Waitformultipleobjects( hArrary , 2);

if ( dwResult == WAIT_OBJECT_0)
delete pTest; // since it is allocated dynamically ( This is required due to some known reasons in my code)

if(dwResult == WAIT_OBJECT_0 + 1)
Doprocessing(); //DoProcessing when other thread signal someotherhandle

}while (1)

void CTest::WaitForShutdown()
{
SetEvent ( hEventShutdown);

WaitForSingleObject ( hThread,INFINITE);

}

void CTest::~CTest()
{
Closehandle(hThread)
Closehandle(hEventShutdown);
}

现在如果你仔细看代码,你会发现事件是从 WaitForShutdown 函数发出信号的,线程从 WaitForMultipleOjbects 出来并删除 CTest 的指针。这意味着调用 CTest 的析构函数,这显然会关闭线程句柄 (hThread)。但是 WaitForShutdown 中的 WaitForSingleObject 实际上是在等待线程句柄。所以这里的行为将是不确定的(我想是的,如果我错了你可以纠正我)。另一个问题是当 WaitForSingleObject 正在等待其成员 hThread 时调用 Ctest 的析构函数,这是不正确的。我无法从线程中删除 delete pTest,因为由于某些原因它必须存在。

您将如何建议解决上述问题?

我能想到的几个解决方案:

  1. 我可以在另一个映射中保留线程句柄,但我不想这样做。
  2. 我可以在 WaitForShutdown 中的 WaitForSingleObject 之前将线程句柄复制到某个局部变量,然后等待它。不知道对不对?你告诉我。
  3. 或者我将在 WaitForSingleObject 之前使用 Duplicatehandle API 获取现有线程句柄的引用并等待它。不知道对不对。不知道在原始句柄上的 CloseHandle 之后重复句柄是否还存在。
  4. 我将保留线程 ID,从线程 ID 获取线程句柄并在 WaitForShutdown 中继续等待线程句柄。这看起来更优雅,但我不知道有什么方法可以从线程 ID 获取句柄。

纠正我。

感谢您的反馈。

最佳答案

处理此问题的最简单方法是在 WaitForSingleObject 返回后简单地从 WaitForShutdown 中删除线程。这可确保您需要的所有句柄 - 更重要的是,对象本身 - 一直保持事件状态。

关于c++ - WaitForSingleObject 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6600670/

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