1

这是我的测试代码

#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 *)'    
4

5 回答 5

2

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

在 x86 上,cdecl 和 stdcall 不同,您不能同时使用单线程过程_beginthread_beginthreadex(在 x64 和 ARM 上,只有一个调用约定,所以 stdcall 和 cdecl 表示相同的意思并且没有必要)。

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

于 2013-06-12T15:27:16.913 回答
1

缺少适当的标头和/或您没有使用多线程 C 运行时库

/* Routine: _beginthreadex
 * Required header: process.h
 */
#include <process.h>
于 2013-06-12T15:12:11.847 回答
1

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

#include <process.h>

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

于 2013-06-12T15:12:58.317 回答
1

让您的threadFunc比赛成为所需的签名!(将 __stdcall 替换为 __cdecl )并使其无效...直到匹配

于 2013-06-12T15:21:23.900 回答
0

或者在 Boost 库的<process.h>包含路径阴影中的某个地方可能有来自不同库的另一个头文件。<process.h>

于 2014-10-09T12:20:03.997 回答