在你提供的代码中,多个线程可能会访问同一个变量 i,这可能导致输出的线程号不是按照期望的方式递增。这是因为所有线程共享相同的内存地址空间,并且在循环中创建线程时,所有线程都可以同时访问和修改变量 i。
为了解决这个问题,你可以通过传递不同的参数值给每个线程来确保它们各自持有独立的计数器值。下面是一个修改后的示例代码:
#ifdef _WIN32
unsigned __stdcall threadfunc(void* arg)
#else
void* threadfunc(void* arg)
#endif
{
int threadNum = *((int*)arg);
printf("start %d\n", threadNum);
// 线程处理逻辑
#ifdef _WIN32
return 0;
#else
pthread_exit(NULL);
#endif
}
int main() {
// ...
for (i = 0; i < stArgs.threadCount; ++i) {
int* threadNum = malloc(sizeof(int)); // 动态分配内存以保存每个线程的编号
*threadNum = i;
#ifdef _WIN32
unsigned int tid;
threads[i] = (HANDLE)_beginthreadex(NULL, 0, &threadfunc, threadNum, 0, &tid);
#else
pthread_create(&threads[i], NULL, &threadfunc, threadNum);
#endif
}
// ...
#ifdef _WIN32
WaitForMultipleObjects(stArgs.threadCount, threads, TRUE, INFINITE);
#else
for (i = 0; i < stArgs.threadCount; ++i) {
pthread_join(threads[i], NULL);
}
#endif
// ...
return 0;
}
在这个修改后的示例中,我们为每个线程分配了独立的内存空间来保存其编号 threadNum,并将其作为参数传递给线程函数。这样确保了每个线程持有自己独立的计数器值,并打印出预期的不同数字。另外,请注意根据操作系统选择合适的线程创建和结束方法(_beginthreadex 和 _endthread 或 pthread_create 和 pthread_exit)。
内容由零声教学AI助手提供,问题来源于学员提问




