将指针传递给pthread_create中的函数

时间:2012-11-15 20:09:50

标签: c pthreads

我试图通过传递一个函数指针来创建一个线程,但是在这一行

pthread_t start_thread(void *func, thread_data *tdata)

它给了我 -

use-hello.c:23: error: invalid conversion from 'void*' to 'void* (*)(void*)    

请输入任何信息......

typedef struct thread_data{
int fd;
int threadId;
}thread_data;


pthread_t start_thread(void *func, thread_data *tdata)
{
   pthread_t thread_id;
   int rc;
      printf("In main: creating thread\n");
      rc = pthread_create(&thread_id, NULL, func, tdata);
      if (rc){
         printf("ERROR; return code from pthread_create() is %d\n", rc);
         exit(-1);
        }
    return(thread_id);
}


void thread_function1(thread_data *tdata){ 
.
.
}

int main(int argc, char **argv){

/* Our file descriptor */
int fd;
int rc = 0;

printf("%s: entered\n", argv[0]);

/* Open the device */
fd = open("/dev/hello1", O_RDWR);

if ( fd == -1 ) {
    perror("open failed");
    rc = fd;
    exit(-1);
}
printf("%s: open: successful, fd=%d\n", argv[0], fd);

//array of function pointers
void (*function[5])(thread_data*);

function[0] = thread_function0;
function[1] = thread_function1;
function[2] = thread_function2; 
function[3] = thread_function3;
function[4] = thread_function4;


//start threads
for(int i=0; i<2; i++){
    thread_data *tdata[i] = (thread_data*)malloc(sizeof(thread_data));
    tdata[i]->threadId = i;
    tdata[i]->fd = fd;
    printf("starting thread = %d\n",start_thread(function[i]), tdata[i]));
}

while(1) sleep(1); // infinite loop

printf("closing file descriptor..\n");
close(fd);
printf("file descriptor closed..\n");

return 0;

}

2 个答案:

答案 0 :(得分:1)

问题是你的start_thread声明,需要void*而不是函数指针。

将其更改为:

pthread_t start_thread(void *(*func) (thread_data *), thread_data *tdata);

该函数指针类型的typedef将简化原型和数组声明。

typedef void (*thread_func)(thread_data*);
pthread_t start_thread(thread_func func, thread_data *tdata);
thread_func function[5];

答案 1 :(得分:0)

您的函数将func设为void*

pthread_t start_thread(void *func, thread_data *tdata)

然后你把它作为第三个参数传递给pthread_create,它应该是void *(*) (void *)

相关问题