循环内创建线程
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]);
}
我正在尝试制作一个简单的程序,我从命令行输入了 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]);
}