我正在尝试制作一个简单的程序,我从命令行输入n int elemnts;在我使用参数创建n个线程后i位置的数字;在此之后*函数打印我放入pthread_create的数字。
int main (int argc, char *argv[]){
pthread_t * tid;
int i=0;
int n;
int *pn = &n;
tid = (pthread_t *) malloc (sizeof(pthread_t)*(argc-1));
for (i=1; i<argc; i++) { //cycle 1
*pn = atoi(argv[i]);
pthread_create(tid+i, NULL, function, (void *) pn);
}
for (i=0; i<argc-1; i++){
pthread_join(tid[i], NULL);
}
return 0;}
void *function(void * param){
int *k = (int *) param;
printf("i got this number: %d\n", *k);
pthread_exit(0);
}
我跑了,我明白了:
./test 1 2 3 4
i got this number: 3
i got this number: 3
i got this number: 4
i got this number: 4
输出总是改变,但我从来没有得到正确的数字(4,1,2,3),不仅按此顺序,我知道我无法得到正确的顺序(这样做我把连接放在循环内1)。有没有办法解决这个问题?
答案 0 :(得分:2)
每个线程都传递相同的指针,因此每个线程都在查看相同的变量。结果你最终处于竞争状态。
您需要为每个线程传递自己的变量:
int *n = malloc(argc * sizeof(int));
if (n == NULL) {
perror("malloc failed");
exit(1);
}
for (i=1; i<argc; i++) { //cycle 1
n[i] = atoi(argv[i]);
pthread_create(tid+i, NULL, function, (void *) &n[i]);
}