这是我的测试代码

#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。我也不知道如何创建两个具有相同功能的线程。

在我包含'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函数。

在xdec和stdcall不同的x86上,不能同时使用_beginthread_beginthreadex的单线程过程(在x64和ARM上,只有一个调用约定,因此stdcall和cdecl表示同一意思,因此不是必需的)。

就是说:不要使用_beginthread。而是使用_beginthreadex,并确保关闭它返回的句柄。 The documentation充分说明了_beginthread的缺点以及为什么首选_beginthreadex

08-26 15:40