我的pthread_create有问题。在这个测试中,我创建了一个整数数组,然后尝试将它们用作必须在线程中执行的函数的参数。
这是我创建索引的地方:
int *indexes = (int *) malloc(sizeof(int)*threadNumber);
int i;
for (i = 0; i < threadNumber; i++){
indexes[i] = i;
}
这就是我创建线程的地方:
int i;
for (i = 0; i < threadNumber; i++){
printf("%i %i ", i, indexes[i]);
}
for (i = 0; i < threadNumber; i++){
printf("%i %i ", i, indexes[i]);
pthread_create(sons + sizeof(pthread_t)*i, NULL, sonSimulation, (void *) &indexes[i]);
}
第一个printf打印以下内容:
0 0 1 1 2 2 3 3 4 4
第二个,打印出相同的输出,打印出来:
0 0 1 1 2 2 3 3 4 23154684
每次执行代码时,最后一个数字都会更改。 我无法解决这个问题。有什么建议吗?
(sonSimulation只打印参数)
答案 0 :(得分:4)
这里有一个问题:
pthread_create(sons + sizeof(pthread_t)*i, NULL, sonSimulation, (void *) &indexes[i]);
您使用
分配sons
pthread_t *sons = (pthread_t * ) malloc(sizeof(pthread_t)*threadNumber);
因此,sons + sizeof(pthread_t)*i
中的pthread_create
是错误的。当您使用sons+i
时,由于指针算法,它会自动向前移动sons
指针sizeof(pthread_t)
个字节。使用sons + sizeof(pthread_t)*i
将指针移动到调用未定义行为的无效内存位置。
要解决此问题,请使用
pthread_create(sons + i, NULL, sonSimulation, (void *) &indexes[i]);
或
pthread_create(&sons[i], NULL, sonSimulation, (void *) &indexes[i]);
而不是
pthread_create(sons + sizeof(pthread_t)*i, NULL, sonSimulation, (void *) &indexes[i]);
另外,正如评论中所指出的那样,你是need not cast the result of malloc
(and family)在C.
@JoachimPileborg comments不需要最后一个参数中的void*
投射。