循环内创建线程

Thread creation inside cycle

我正在尝试制作一个简单的程序,我从命令行输入了 n 个 int 元素;在我创建 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)。有没有办法解决这个问题?

每个线程都传递相同的指针,因此每个线程都在查看相同的变量。结果你最终陷入了竞争状态。

你需要给每个线程传递它自己的变量:

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]);
}