C 多线程一起打印值

C 多线程一起打印值,c,multithreading,thread-safety,pthreads,C,Multithreading,Thread Safety,Pthreads,我试图理解为什么我在线程中运行代码时得到了这个答案。 我不明白为什么每次我的价值观都不一样。 是否所有线程都要等到创建完成后再转到printHello函数?创建新线程时,没有固定的线程执行顺序。主线程和新创建的线程将彼此并发运行 关于i变量的问题是,您正在将i的地址传递给pthread_create函数。由于此变量在后续循环迭代时更新,因此当您从printHello回调函数中通过其地址访问它时,其值将发生更改。在您的输出中,我们可以看到主函数中的循环在任何派生线程输出任何内容之前已经完成,因为

我试图理解为什么我在线程中运行代码时得到了这个答案。 我不明白为什么每次我的价值观都不一样。


是否所有线程都要等到创建完成后再转到printHello函数?

创建新线程时,没有固定的线程执行顺序。主线程和新创建的线程将彼此并发运行

关于i变量的问题是,您正在将i的地址传递给pthread_create函数。由于此变量在后续循环迭代时更新,因此当您从printHello回调函数中通过其地址访问它时,其值将发生更改。在您的输出中,我们可以看到主函数中的循环在任何派生线程输出任何内容之前已经完成,因为我已经达到NUM_线程限制

如果希望事情是确定性的,那么创建一个新变量来保存线程ID,并传入该线程的地址位置:

int threadIds[NUM_THREADS];
int rc;
int i;

for (i = 0; i < NUM_THREADS; i++)
{
    threadIds[i] = i;
    rc = pthread_create(&threads[i], NULL, printHello, threadIds + i);
}
另外,阻塞主线程,直到所有生成的线程都完成执行,并且不要在主函数中调用pthread_exit。它不在pthread内部运行,因此不需要退出

int threadIds[NUM_THREADS];
int rc;
int i;

for (i = 0; i < NUM_THREADS; i++)
{
    threadIds[i] = i;
    rc = pthread_create(&threads[i], NULL, printHello, threadIds + i);
}