ZBLOG

for (i = 0; i < stArgs.threadCount; ++i) { #ifdef _WIN32 //threads[i] = CreateThread(NULL, 0, threadfunc, NULL, 0, NULL); threads[i] = _beginthread(threadfunc, 0, &i); #else pthread_create(&threads[i], NULL, handlePackets, ...

在你提供的代码中,多个线程可能会访问同一个变量 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_endthreadpthread_createpthread_exit)。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=13489

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?