这是我的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>
头文件。