Win32无法恢复自行挂起的线程

时间:2012-01-03 16:22:09

标签: windows multithreading winapi

在Win32中我想使用Suspend(GetCurrentThread());挂起一个帖子,但我发现我无法使用ResumeThread(suspend thread handle);恢复它但我发现什么都没发生。

这是我的代码。

HANDLE C;
DWORD WINAPI A (LPVOID in)
{
    C = GetCurrentThread();
    cout << "1";
    SuspendThread (C);
    cout << "4";
    return 0;
}
DWORD WINAPI B (LPVOID in)
{
    Sleep (200);
    cout << "2";
    ResumeThread (C);
    cout << "3";
    return 0;
}
int main()
{
    CreateThread (NULL, 0, A, NULL, 0, NULL);
    CreateThread (NULL, 0, B, NULL, 0, NULL);
    Sleep (INFINITE);
    return 0;
}

我屏幕上显示的是123

1 个答案:

答案 0 :(得分:2)

现在有可能在B调用ResumeThread时,变量C包含未初始化的值。

但是,您的代码不起作用的当前原因是GetCurrentThread仅返回伪线程句柄,该值被解释为表示当前线程句柄。要获得可以从其他线程使用的真实线程,您可以从第一个CreateThread调用的返回中获取一个或使用DuplicateHandle转换伪句柄。

修改:使用方法1:

HANDLE C;
DWORD WINAPI A (LPVOID in)
{
    cout << "1";
    SuspendThread (C);
    cout << "4";
    return 0;
}
DWORD WINAPI B (LPVOID in)
{
    Sleep (200);
    cout << "2";
    ResumeThread ((HANDLE)in);
    cout << "3";
    return 0;
}
int main()
{
    C = CreateThread (NULL, 0, A, NULL, 0, NULL);
    CreateThread (NULL, 0, B, (LPVOID)C, 0, NULL);
    Sleep (INFINITE);
    return 0;
}

事实上,您的代码存在另一个问题,即在CreateThread返回的句柄应该被关闭时会被忽略。还缺少错误检查,但为了简洁,我假设你省略了。

您还应注意,根据上下文切换的时间,实际上可以输出上述代码:

  

1243

使用方法2:

HANDLE C = NULL;
DWORD WINAPI A (LPVOID in)
{
    C = GetCurrentThread();
    DuplicateHandle( GetCurrentProcess(), C, GetCurrentProcess(), &C, 0, FALSE, DUPLICATE_SAME_ACCESS );
    cout << "1";
    SuspendThread (C);
    cout << "4";
    return 0;
}
DWORD WINAPI B (LPVOID in)
{
    Sleep (200);
    cout << "2";

    while( C == NULL ) {
      Sleep(100);
    }
    ResumeThread(C);
    cout << "3";
    return 0;
}
int main()
{
    CreateThread (NULL, 0, A, NULL, 0, NULL);
    CreateThread (NULL, 0, B, NULL, 0, NULL);
    Sleep (INFINITE);
    return 0;
}