9

我正在尝试使用 pthread_create() 但它总是给我这个错误从void*到的无效转换void* ( * )(void*)

此错误在第三个参数中。有人可以帮我解决这个错误吗?

void Print_data(void *ptr) {
    cout<<"Time of Week = " <<std::dec<<iTOW<<" seconds"<<endl;
    cout<<"Longitude = "<<lon<<" degree"<<endl;
    cout<<"Latitude  = "<<lat<<" degree"<<endl;
    cout<<"Height Above Sea = "<<alt_MSL<<" meters"<<endl;    
  }

int call_thread() 
  {
    pthread_create(&thread, NULL, (void *) &Print_data, NULL);
    return 0;
  }
4

5 回答 5

18

错误是您将函数指针 ( void* (*)(void*)) 转换为对象指针 ( void*),而此时pthread_create需要该参数的函数指针。没有隐式转换可以撤消您所做的狡猾转换,因此会出现错误。

答案是不要这样做:

pthread_create(&thread, NULL, &Print_data, NULL);

并且您还需要修改Print_data以返回void*以匹配 Posix 线程接口:

void *Print_data(void *ptr) {
    // print stuff
    return NULL;  // or some other return value if appropriate
}

如评论中所述,直接从 C++ 使用此 C 库还有其他各种问题;特别是为了可移植性,线程入口函数应该是extern "C". 就个人而言,我建议使用标准的 C++ 线程库(或 Boost 的实现,如果您坚持使用 2011 年之前的语言版本)。

于 2013-06-17T12:39:44.153 回答
4

您正在尝试将函数指针转换为void*此处:(void *) &Print_data

根据pthread_create您需要传入一个接受 avoid*并返回 a的函数void*

所以你的函数签名应该是

void* Print_data(void *ptr) 

你的电话应该是

pthread_create(&thread, NULL, &Print_data, NULL);
于 2013-06-17T12:41:13.237 回答
3

pthread_create将第三个参数作为

int pthread_create(pthread_t *thread,
                   const pthread_attr_t *attr,
                   void *(*start_routine)(void*),
                   void *arg);

void *(*start_routine)(void*)是一个指向函数的指针,该函数接受一个void*指针并返回一个void*指针。

当您这样做&Print_data并将指针转换为 时void *,这意味着您正在传递一个类型的指针,void*而不是类型void *(*start_routine)(void*)[函数指针] 的指针。

要正确,您需要将返回类型设置为void*并将调用设置为pthread_create(&thread, NULL, &Print_data, NULL);

于 2013-06-17T12:45:30.753 回答
2

你必须返回void*

void* Print_data(void *ptr) {

以满足需求。

要传递的函数的签名是

void* function(void*);

然后调用pthread_create使用

 pthread_create(&thread, NULL, &Print_data, NULL);
于 2013-06-17T12:39:08.200 回答
0

添加头文件#include并编译g++ -lpthread

于 2016-05-27T11:19:46.497 回答