pthread_create更改数组

时间:2015-06-22 08:21:44

标签: c multithreading

我的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只打印参数)

1 个答案:

答案 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*投射。