_beginthread / ex C3861 – 找不到标识符

这是我的testing代码

#include "stdafx.h" #include "windows.h" #include "iostream" using namespace std; HANDLE hMutex; static unsigned __stdcall threadFunc(void *params) { WaitForSingleObject(hMutex,INFINITE); printf(":D:D:D\n"); ReleaseMutex(hMutex); return NULL; } int _tmain(int argc, _TCHAR* argv[]) { hMutex=CreateMutex(NULL,FALSE,NULL); //first try unsigned dwChildId; _beginthreadex(NULL, 0, &threadFunc, NULL, 0, &dwChildId); //second try _beginthread(threadFunc, 0, NULL ); WaitForSingleObject(hMutex,INFINITE); printf("HD\n"); ReleaseMutex(hMutex); int i; cin >> i; return 0; } 

给我2个错误:

 Error 1 error C3861: '_beginthreadex': identifier not found Error 2 error C3861: '_beginthread': identifier not found 

我使用MFC作为共享DLL。 另外我不知道如何创build两个具有相同function的线程。

在我包括'process.h'

 Error 2 error C2664: '_beginthread' : cannot convert parameter 1 from 'unsigned int (__stdcall *)(void *)' to 'void (__cdecl *)(void *)' 

_beginthread_beginthreadex需要不同类型的功能。 _beginthread需要一个cdecl函数; _beginthreadex需要一个stdcall函数。

在x86上,cdecl和stdcall是不同的,不能同时使用_beginthread_beginthreadex (在x64和ARM上,只有一个调用约定,所以stdcall和cdecl意味着同样的事情,不是必须的)。

这就是说:不要使用_beginthread 。 相反,使用_beginthreadex ,并确保关闭它返回的句柄。 该文档充分解释了_beginthread的缺点,以及为什么_beginthreadex更可取。

您错过了适当的标题和/或您没有使用多线程的C运行时库 。

 /* Routine: _beginthreadex * Required header: process.h */ #include <process.h> 

文档建议它在process.h中,所以你需要

 #include <process.h> 

请注意, ""搜索不同的路径<>

让你的threadFunc匹配所需的签名! (将__stdcall替换为__cdecl)并使其无效,直到匹配

或者可以在Boost库的包含路径shadowing <process.h>某个不同的库中添加另一个<process.h>头文件。