我试图理解为什么我在线程中运行此代码时得到了这个答案。 我不明白为什么每次都不会让我有所不同。
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#define NUM_THREADS 5
void *printHello(void *threadid)
{
int tid = *(int*)threadid;
printf("Hello World! It's me, thread #%d!\n", tid);
pthread_exit(NULL);
}
int main(int argc, char *argv[])
{
pthread_t threads[NUM_THREADS];
int rc;
int i;
for (i = 0; i < NUM_THREADS; i++)
{
printf("In main: creating thread %ld\n", i,);
rc = pthread_create(&threads[i], NULL, printHello, &i);
if (rc)
{
printf("ERROR; return code from pthread_create() is %d\n", rc);
exit(-1);
}
}
pthread_exit(NULL);
}
让所有线程等到他们完成创建它们然后再去printHello函数?
答案 0 :(得分:1)
创建新线程时,没有固定的线程执行顺序。主线程和新创建的线程将简单地相互并行运行。
与i
变量相关的问题是您将i
的地址传递给pthread_create
函数。由于此变量在后续循环迭代时会更新,因此当您通过其地址(来自printHello
回调函数)访问它时,其值将会更改。在您的输出中,我们可以看到main
函数中的循环在任何生成的线程输出任何内容之前已经完成,因为i
已经达到NUM_THREADS
限制。
如果您希望事物具有确定性,那么创建一个新变量来保存线程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
函数中调用main
。它不是在pthread内运行,所以它不需要退出。