我对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*

10-04 21:11