Windows 中的多线程 - 创建函数指针数组时出错

Posted

技术标签:

【中文标题】Windows 中的多线程 - 创建函数指针数组时出错【英文标题】:Multithreading in Windows - Error in creating array of function pointers 【发布时间】:2014-03-06 11:50:33 【问题描述】:

我是多线程(Windows)的初学者。我想通过在 for 循环中使用 CreateThread 函数来创建 2 个线程。但是我想产生的两个线程函数是不同的。所以我正在创建一个函数指针数组来存储我想要生成的两个函数。我将在创建线程函数的 lpStartAddress 参数中使用数组值。但是我在创建函数指针数组时遇到错误。我只发布了下面代码的重要部分。所以请纠正我的错误并帮助我创建一个函数指针数组(其函数将作为线程产生)。提前致谢。

DWORD WINAPI Threadproc1(LPVOID lparam)

    print_func(GetCurrentThreadId(),(LPDWORD)lparam);
    return 1;


DWORD WINAPI Threadproc2(LPVOID lparam)

    print_func(GetCurrentThreadId(),(LPDWORD)lparam);
    return 1;


int main()

        HANDLE hThread[MAX_THREADS] = NULL;//MAX_THREADS=2
    DWORD dwthreadid;

    /* Array of lparam */
    DWORD dwArrayparam[PARAM_MAX] = 1,2;//PARAM_MAX=2

    /* Array of function ptrs */
    typedef DWORD WINAPI (*t_Threadproc)(LPVOID);//ERROR in this line
    t_Threadproc Threadproc[MAX_THREADS] = Threadproc1,Threadproc2;

for(int i=0; i<MAX_THREADS; i++)

    hThread[i] = CreateThread(NULL,//security attributes
                  0,//stack size
                      Threadproc[i],//thread start address
                      (dwArrayparam+i),
                      0,
                      &dwthreadid
                      );    


编译错误: 我得到的错误是错误 C2059:语法错误:'(' 如果我删除调用约定 WINAPI 我会在下一行出现错误 错误 C2440:“正在初始化”:无法从“DWORD (__stdcall *)(LPVOID)”转换为“t_Threadproc”

【问题讨论】:

2 个线程??只需调用两次 CreateThread? 你遇到了什么错误? @Martin James 是可以做到的,但实际情况是我有更多线程。为简单起见,我只是缩小了问题的范围。 发布有关编译器错误的问题时,实际上能够知道错误是什么通常非常有帮助。请编辑您的问题以包含完整且未经编辑的错误日志。 @o_weisman 我得到的错误是 error C2059: syntax error : '(' 【参考方案1】:

我相信这条线应该是这样的:

typedef DWORD (WINAPI *t_Threadproc)(LPVOID);

即关键字WINAPI 需要在括号内。

【讨论】:

以上是关于Windows 中的多线程 - 创建函数指针数组时出错的主要内容,如果未能解决你的问题,请参考以下文章

pthread_create的函数简介

如何安全地终止线程? (使用指针)C++

在C语言的多线程编程中一般volatile应该用在啥地方?

c++ windows中客户端服务器编程中的多线程

是否可以在 Windows 上运行时从可执行文件中定位函数?

dll中的多线程