下面的多线程程序哪里出了问题,为什么会得到下面的结果?


下面的多线程程序哪里出了问题,为什么会得到下面的结果?

   
  #include "csapp.h"//本头文件可网上下载!
  
#define N 4

void *thread(void *vargp);

int main()
{
pthread_t tid[N];
int i;

for(i=0;i<N; i++)
Pthread_create(&tid[i], NULL, thread, &i);
for(i=0;i<N; i++)
Pthread_join(tid[i], NULL);
exit(0);
}

/* Thread routine */
void *thread(void *vargp)
{
int myid = *((int *)vargp);
printf("Hello from thread %d\n", myid);
return NULL;
}

输出:

   
  Hello from thread 1
  
Hello from thread 3
Hello from thread 2
Hello from thread 3

Linux 多线程

推到赵叔叔 11 years, 4 months ago

你传进去的是个指针,这个指针指向的i在创建完之后立即就变了,而这时候线程还不一定读取到这个值。所以输出的结果是不确定的。
其实虽然参数类型是void*,但实际上也可以通过强制转换来传递一个int进去的:

   
  #include "csapp.h"//本头文件可网上下载!
  
#define N 4

void *thread(void *vargp);

int main()
{
pthread_t tid[N];
int i;

for(i=0;i<N; i++)
Pthread_create(&tid[i], NULL, thread, (void*)i); //注意这里
for(i=0;i<N; i++)
Pthread_join(tid[i], NULL);
exit(0);
}

/* Thread routine */
void *thread(void *vargp)
{
int myid = (int)vargp; //还有这里
printf("Hello from thread %d\n", myid);
return NULL;
}

天体D孤云 answered 11 years, 4 months ago

Your Answer