循环内创建线程

时间:2015-07-17 20:23:26

标签: c multithreading sync semaphore

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

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