gpt4 book ai didi

c++ - 使用传递函数指针调用 _beginthreadx

转载 作者:太空宇宙 更新时间:2023-11-04 11:43:43 25 4
gpt4 key购买 nike

我很想知道是否可以使用未知且不基于类设计的函数指针调用 _beginthreadex。例如:

#include <stdio.h>
#include <process.h>
#include <windows.h>

int myThread(void* data)
{
printf("ThreadID: %d \n", GetCurrentThreadId());
return 1;
}

HANDLE callIntThreadFunc(void (*pFunction)(LPVOID), LPVOID pvFuncArgs)
{
//Expected to fail compilation due to __stcall
return (HANDLE) _beginthreadex(NULL, NULL, pFunction, (LPVOID) pvFuncArgs, NULL, NULL);
}

int main(int argc, char *argv[])
{
HANDLE hThread = callIntThreadFunc(myThread, NULL);
WaitForSingleObject(hThread , INFINITE);

return 0;
}

我知道 _beginthread 在转换函数时可以工作(通过以下代码):

return (HANDLE) _beginthread((void (*)(void*)) pFunction, 0, (LPVOID) pvFuncArgs);

所以我的问题是在这种情况下是否可以使用 _beginthreadex,如果可以如何使用?任何想法将不胜感激。

最佳答案

未知且不基于类设计”是什么意思?其一,_beginthreadex() 不是面向对象的 API。

至于已知部分,好吧:当使用函数指针时,编译器至少需要知道指向的函数在哪里(它的地址)以及如何调用它(它期望的参数是什么以及它返回的值)。如果您偏离该契约(Contract),则无法保证:调用可能最终可靠地工作或不可靠地工作,具体取决于生成的代码。

在您的示例中,_beginthreadex() 告诉您它需要一个使用 __stdcall 约定的函数,将地址作为参数并且不返回任何结果。你给它一个返回 int 并接受地址参数的函数,但是(假设默认编译器设置)使用常规 C 调用约定而不是 __stdcall:因此一些堆栈腐败是可能的。通过使用强制转换,您只是告诉编译器停止提示并生成调用(无论结果如何)。

如果您想像在您的示例中那样做一些事情,为 _beginthreadex() 提供一个 __stdcall 函数会更安全,该函数调用您实际想要使用的任何函数。

关于c++ - 使用传递函数指针调用 _beginthreadx,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20412633/

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