当我尝试编译以下代码时:
#include <pthread.h>
#include <stdio.h>
#define ARRAYSIZE 17
#define NUMTHREADS 4
struct ThreadData {
int start, stop;
int* array;
};
/* puts i^2 into array positions i=start to stop-1 */
void* squarer(struct ThreadData* td) {
struct ThreadData* data=(struct ThreadData*) td;
int start=data->start;
int stop=data->stop;
int* array=data->array;
int i;
for (i=start; i<stop; i++) {
array[i]=i*i;
}
return NULL;
}
int main(void) {
int array[ARRAYSIZE];
pthread_t thread[NUMTHREADS];
struct ThreadData data[NUMTHREADS];
int i;
/*
this has the effect of rounding up the number of tasks
per thread, which is useful in case ARRAYSIZE does not
divide evenly by NUMTHREADS.
*/
int tasksPerThread=(ARRAYSIZE+NUMTHREADS-1)/NUMTHREADS;
/* Divide work for threads, prepare parameters */
for (i=0; i<NUMTHREADS; i++) {
data[i].start=i*tasksPerThread;
data[i].stop=(i+1)*tasksPerThread;
data[i].array=array;
}
/* the last thread must not go past the end of the array */
data[NUMTHREADS-1].stop=ARRAYSIZE;
/* Launch Threads */
for (i=0; i<NUMTHREADS; i++) {
pthread_create(&thread[i], NULL, squarer , &data[i]);
}
/* Wait for Threads to Finish */
for (i=0; i<NUMTHREADS; i++) {
pthread_join(thread[i], NULL);
}
/* Display Result */
for (i=0; i<ARRAYSIZE; i++) {
printf("%d ", array[i]);
}
printf("\n");
return 0;
}
我收到此错误:
警告:从不兼容的指针类型pthread_create(&amp; thread [i],NULL,* squarer,&amp; data [i])传递'pthread_create'的参数3; ^
有谁知道如何修复它?
由于
答案 0 :(得分:2)
函数squarer
的类型为void *(*)(struct ThreadData *)
,但pthread_create
需要void *(*)(void *)
类型的参数。这些类型是不兼容的。
更改您的函数以获取void *
参数,然后将其分配给struct ThreadData *
。
void* squarer(void *td) {
struct ThreadData* data=td;
....
答案 1 :(得分:1)
传递给pthread_create()
的第三个参数必须是void * (*)(void *)
类型。
您的类型为void * (*)(struct ThreadData * td)
。
修复此更改
void* squarer(struct ThreadData* td) {
struct ThreadData* data=(struct ThreadData*) td;
成为
void* squarer(void * td) {
struct ThreadData * data = td;