使用CreateThread启动线程时类型不兼容错误求助
解决CreateThread线程函数类型不兼容的问题
这个问题我之前踩过坑,核心原因其实是调用约定不匹配——虽然你把线程函数设为静态了,但Windows的CreateThread对线程函数的签名有严格要求,必须符合LPTHREAD_START_ROUTINE的定义:
typedef DWORD (__stdcall *LPTHREAD_START_ROUTINE)(LPVOID lpParameter);
简单说,你的静态函数不仅要消除隐式的this指针(静态成员函数做到了这一点),还必须显式指定__stdcall调用约定(或者用Windows定义的WINAPI宏,两者等价)。
修正后的代码示例
假设你的调度器是一个类,正确的写法应该是这样:
#include "stdafx.h" #include <string> #include <windows.h> #include <vector> class Scheduler { private: // 必须用WINAPI修饰的静态线程函数,严格匹配签名 static DWORD WINAPI WorkerThread(LPVOID lpParam) { // 如果需要访问类的非静态成员,把传入的this指针转换回来 Scheduler* pScheduler = static_cast<Scheduler*>(lpParam); pScheduler->ExecuteTask(); // 调用类的非静态方法执行任务 return 0; // 线程结束返回值 } // 实际的任务执行逻辑(非静态成员函数) void ExecuteTask() { // 这里写你的调度任务代码 } public: void StartNewThread() { HANDLE hThread = CreateThread( NULL, // 默认安全属性 0, // 默认栈大小 WorkerThread, // 现在类型匹配的线程函数指针 this, // 把当前对象指针传给线程函数 0, // 立即启动线程 NULL // 不需要获取线程ID ); if (hThread != NULL) { // 线程启动后,记得关闭句柄(不影响线程运行) CloseHandle(hThread); } } };
关键注意事项
调用约定必须匹配:
普通成员函数默认调用约定是__thiscall,静态成员函数默认是__cdecl(VC++环境下),都和LPTHREAD_START_ROUTINE要求的__stdcall不匹配,所以必须显式加WINAPI或__stdcall。访问非静态成员的技巧:
如果线程需要操作类的非静态成员,把this指针作为CreateThread的lpParameter参数传入,在线程函数里转换回类指针即可,这样就能调用非静态方法了。签名完全一致:
线程函数必须返回DWORD,参数只能有一个LPVOID类型的参数,不能多也不能少,否则都会导致类型不兼容。
只要按照上面的方式调整,就能解决这个类型不匹配的错误了。
内容的提问来源于stack exchange,提问作者ankit
相关产品推荐
相关产品推荐

