咨询SetThreadAffinityMask绑定首个核心的用法是否正确,GetCurrentThread无效
代码问题分析与修正
原代码中的错误点
- start函数语法错误:函数定义后缺少起始大括号
{,导致代码无法编译。 - SetThreadAffinityMask参数错误:第一个参数需要传入
HANDLE类型的线程句柄,而非HANDLE*指针,你传入了&handle,这会导致调用失败。 - 不必要的OpenThread调用:在当前线程内部,直接使用
GetCurrentThread()获取的伪句柄即可操作自身,无需通过GetCurrentThreadId()再打开线程,伪句柄对当前线程始终有效。 - 权限过度申请:
OpenThread使用THREAD_ALL_ACCESS权限过高,实际设置线程亲和性仅需THREAD_SET_INFORMATION权限,过高权限可能导致打开线程失败(比如进程权限不足)。 - DllMain逻辑错误:
DLL_PROCESS_ATTACH分支后没有break,会继续执行后续case分支,可能引发意外行为。 - 资源泄漏:
OpenThread获取的线程句柄未调用CloseHandle释放,会造成句柄泄漏。
GetCurrentThread无法正常工作的原因
GetCurrentThread()返回的是伪句柄,它仅在当前线程上下文中有效,不能跨线程使用。但在你自己的线程里调用它来设置亲和性是完全可行的,你之前觉得无法工作大概率是因为其他代码错误(比如SetThreadAffinityMask的参数传错)导致的。
修正后的代码
修正后的start函数
void start() { // 直接使用GetCurrentThread()获取当前线程的伪句柄 HANDLE hThread = GetCurrentThread(); // 设置亲和性到第一个核心(CPU 0,掩码0x01) DWORD_PTR result = SetThreadAffinityMask(hThread, 0x01); if (result == 0) { // 可添加错误处理,比如调用GetLastError()查看失败原因 } for (;;) { Xtimer MyRdtscTimer; MyRdtscTimer.Delay(1000000000); } }
修正后的DllMain
BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: DisableThreadLibraryCalls(hModule); // 创建线程后获取句柄,用完及时关闭避免资源泄漏 HANDLE hNewThread = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)&start, 0, 0, 0); if (hNewThread != NULL) { CloseHandle(hNewThread); } break; // 必须添加break,避免执行后续case分支 case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; }
补充说明
- 线程亲和性掩码
0x01确实对应系统的第一个CPU核心(编号从0开始),如果要绑定到第二个核心(CPU1),掩码改为0x02即可。 - 调用
SetThreadAffinityMask后返回值是之前的亲和性掩码,如果返回0说明调用失败,可以通过GetLastError()获取具体错误码排查问题。
内容的提问来源于stack exchange,提问作者maor03
相关产品推荐
相关产品推荐

