【问题标题】:WaitForSingleObject waits infinitely for thread terminateWaitForSingleObject 无限等待线程终止
【发布时间】:2014-08-14 18:09:23
【问题描述】:

我有两个功能:

Fl_Thread n_create_thread(Fl_Thread &t, void *(*f) (void *), void *p) 
{
    return t = (Fl_Thread)_beginthread((void(__cdecl *)(void *))f, 0, p);    
}

void n_wait_end_thread(Fl_Thread t) 
{
    WaitForSingleObject((HANDLE)t, INFINITE);    
}

创建线程,给线程函数指针,但是如果我等待通过WaitForSingleObject终止线程,它就会挂起并且无法停止等待。

【问题讨论】:

  • 你可能想检查 _beginthread 的返回值,看看它是否真的是一个有效的句柄。
  • 你确定f() 真的退出了吗?
  • 还请记住,_endthread()(在 _beginthread() 线程终止时调用)关闭线程句柄,因此等待可能失败。
  • 顺便说一句,在将f 传递给_beginthread() 时,您根本不应该进行类型转换:_beginthread(f, ...); 如果因为f 是错误的签名而导致编译器失败,那是真正的可能导致真正的运行时问题的错误,因此类型转换只会隐藏它。通常(并非总是)当您必须对某些内容进行类型转换时,您可能做错了什么。
  • 顺便说一句,为什么n_create_thread() 同时具有Fl_Thread 返回值和Fl_Thread 参考参数?参数的目的是什么?它没有被使用。如果它是一个输出参数,你可能应该这样做:t = (Fl_Thread) _beginthread(...); return t;

标签: c multithreading winapi


【解决方案1】:

当您等待线程句柄时,您的线程句柄可能无效 - 请改用 _beginthreadex - see the MSDN page

使用 _beginthreadex 比使用 _beginthread 更安全。如果线程 由 _beginthread 生成的快速退出,句柄 返回给 _beginthread 的调用者可能无效或指向 另一个线程。但是,_beginthreadex 返回的句柄 必须由_beginthreadex的调用者关闭,所以保证 如果 _beginthreadex 没有返回错误,则成为有效句柄。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-21
    • 2012-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多