Windows – Win32无法恢复自行暂停的线程

前端之家收集整理的这篇文章主要介绍了Windows – Win32无法恢复自行暂停的线程前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在Win32中,我想使用Suspend(GetCurrentThread())挂起一个线程;但我发现我无法使用ResumeThread(暂停线程句柄)恢复它;但我发现什么都没发生.

这是我的代码.

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,A,NULL,NULL);
    CreateThread (NULL,B,NULL);
    Sleep (INFINITE);
    return 0;
}

我在屏幕上看到的只有123.

解决方法

现在可以在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,(LPVOID)C,NULL);
    Sleep (INFINITE);
    return 0;
}

事实上,您的代码还有另一个问题,即CreateThread返回的句柄在关闭时会被忽略.还有一个缺乏错误检查,但我认为你为了简洁省略了.

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

1243

使用方法2:

HANDLE C = NULL;
DWORD WINAPI A (LPVOID in)
{
    C = GetCurrentThread();
    DuplicateHandle( GetCurrentProcess(),C,GetCurrentProcess(),&C,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,NULL);
    Sleep (INFINITE);
    return 0;
}

猜你在找的Windows相关文章