从C ++ 11线程获取Win32 API的本机线程句柄

问题描述

我想在windows.h上使用std::thread中的某些Win32 API函数。首先,我正在创建并启动std::thread。然后,我想通过使用native_handle()获取句柄在其上使用Win32 API函数。

// suspend_thread.cpp

#include <windows.h>
#include <iostream>
#include <thread>

void foo()
{
    unsigned int counter = 1;
    while (counter <= 5)
    {
        // do some work and finish after about 5 seconds
        std::cout << "Running... " << counter << "/5" << std::endl;
        counter++;
        std::this_thread::sleep_for(std::chrono::seconds(1));
    }
    std::cout << "Done!" << std::endl;
}

int main(void)
{
    std::cout << "Starting thread..." << std::endl;
    std::thread my_thread(foo);

    std::cout << "Waiting 3 seconds..." << std::endl;
    std::this_thread::sleep_for(std::chrono::seconds(3));

    DWORD result = SuspendThread((void*) my_thread.native_handle());
    if (result != -1) std::cout << "Successfully suspended thread!" << std::endl;
    else std::cout << "Failed to suspend thread! Error: " << GetLastError() << std::endl;

    my_thread.join();
    return 0;
}

如果我不将native_handle()的结果强制转换为void* ...

DWORD result = SuspendThread(my_thread.native_handle());

...代码无法编译,因为SuspendThread()需要一个指针。

.\suspend_thread.cpp:25:57: error: invalid conversion from 'std::thread::native_handle_type' {aka 'unsigned int'} to 'HANDLE' {aka 'void*'} [-fpermissive]

现在,如果我编译并运行第一个示例,则会得到以下结果。

PS> g++ -std=c++11 -pthread suspend_thread.cpp -o suspend_thread.exe
PS> ./suspend_thread.exe
Starting thread...
Waiting 3 seconds...
Running... 1/5
Running... 2/5
Running... 3/5
Failed to suspend thread! Error: 6
Running... 4/5
Running... 5/5
Done!

我试图在线程运行时挂起它,但是该函数失败,错误代码为6,根据文档,它代表...

ERROR_INVALID_HANDLE (0x6): The handle is invalid.

...显然,这不是将句柄传递给Win32 API函数的正确方法。

我知道我可以不用Win32 API来以其他方式暂停和恢复线程。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...