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

标签 c++ multithreading function-pointers beginthreadex

我很想知道是否可以使用未知且不基于类设计的函数指针调用 _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/

相关文章:

c++ - 如何在 Qt5 中使 QOpenGLContext 成为当前没有表面的?

java - 在 Swing 组件和工作线程之间传递数据

C# 将较大的方法分成两个线程

c - 在 C 程序中定义指向函数的指针变量

javascript - JavaScript 中的作用域和闭包问题

c++ - 在 std::bind 中包装一个 lambda 以捕获 R 值

c++ - 稳定级联阴影映射中的光 View 矩阵

c++ - 函数指针、Functor 还是 Lambda?

c++ - 为什么 LLVM 完全展开我的循环?

perl - 为什么我的 Perl 线程在第一次运行时随机执行,但在后续运行时按顺序执行?