我对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只是打印参数)
最佳答案
这里有一个问题:
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]);
另外,正如注释中指出的那样,您在C语言中为need not cast the result of
malloc
(and family)。也不需要作为@JoachimPileborg comments强制转换为的最后一个参数的
void*
。