_beginthreadex创建多线程(数量超2时)崩溃问题排查求助
问题排查与修复建议
先贴出你提供的核心代码:
arrayThread = (int*)malloc(NUM_OF_THREADS * sizeof(int)); for (i = 0; i < NUM_OF_THREADS; i++) { f_vars.begin_simulations = (int)i*(no_of_simulations / NUM_OF_THREADS); f_vars.end_simulations = (int)(i+1)*(no_of_simulations / NUM_OF_THREADS)-1; arrayThread[i] = _beginthreadex(NULL, 0, functionPtr, &f_vars, 0, &ThreadId); if (arrayThread[i] == NULL) { printf("Create Thread %d get failed. Error no: %d", i, GetLastError); } } WaitForMultipleObjects(NUM_OF_THREADS, arrayThread, TRUE, INFINITE); for (i = 0; i < NUM_OF_THREADS; i++) { CloseHandle(arrayThread[i]); }
核心问题点
线程句柄类型不匹配:
_beginthreadex返回的是HANDLE类型(本质是指针),你却用int*来存储。在64位系统中,HANDLE占8字节,int仅占4字节,强制转换会截断句柄值,导致后续WaitForMultipleObjects或CloseHandle操作非法内存,甚至在赋值阶段就触发崩溃。线程数越多,这种错误的触发概率越高。共享参数的数据竞争:所有线程共用同一个
f_vars实例。循环中你不断修改f_vars的区间参数,新创建的线程可能还没来得及读取参数,就被下一次循环覆盖了。这种数据竞争会导致线程拿到错误的参数,甚至引发内存访问异常。添加printf相当于给线程启动增加了延迟,让线程有足够时间读取参数,所以崩溃概率降低;线程数越多,竞争越激烈,崩溃就越频繁。GetLastError调用错误:你写的是GetLastError而非GetLastError(),这会打印函数的地址而非实际错误码,无法正确排查线程创建失败的原因。未检查
malloc结果:如果malloc分配失败,arrayThread会是NULL,后续对arrayThread[i]的赋值直接触发空指针崩溃。
修复方案
修正句柄存储类型:把
arrayThread改成HANDLE*类型:HANDLE* arrayThread = (HANDLE*)malloc(NUM_OF_THREADS * sizeof(HANDLE));为每个线程分配独立参数:避免共享
f_vars,可以在循环内动态分配参数结构体:// 假设你有ThreadParams结构体存储区间参数 typedef struct { int begin_simulations; int end_simulations; } ThreadParams; for (i = 0; i < NUM_OF_THREADS; i++) { ThreadParams* params = (ThreadParams*)malloc(sizeof(ThreadParams)); params->begin_simulations = i*(no_of_simulations / NUM_OF_THREADS); params->end_simulations = (i+1)*(no_of_simulations / NUM_OF_THREADS)-1; arrayThread[i] = _beginthreadex(NULL, 0, functionPtr, params, // 传递独立参数 0, &ThreadId); // 线程函数内部记得free(params) }修复
GetLastError调用:printf("Create Thread %d get failed. Error no: %d", i, GetLastError());检查
malloc结果:arrayThread = (HANDLE*)malloc(NUM_OF_THREADS * sizeof(HANDLE)); if (arrayThread == NULL) { printf("Failed to allocate memory for thread handles\n"); // 处理错误逻辑 return; }
内容的提问来源于stack exchange,提问作者You'llNeverKnow
相关产品推荐
相关产品推荐

