【问题标题】:error: invalid conversion from ‘int (*)(void*)’ to ‘void* (*)(void*)’错误:从‘int (*)(void*)’到‘void* (*)(void*)’的无效转换
【发布时间】:2016-03-16 15:22:41
【问题描述】:

我正在尝试生成 pthread 并发送一个整数作为参数,但是在将参数转换为 void 时出现以下错误。我试图删除 (void*) 并使转换隐式,但我仍然遇到同样的错误

error: invalid conversion from ‘int (*)(void*)’ to ‘void* (*)(void*)’ [-fpermissive]
   rc=pthread_create(&threads[i],NULL,probSAT, (void *)&threads_args[i]);

void Solver::p(char** argc)
{
    argvp=argc;
    pthread_t threads[NTHREADS];
    int threads_args[NTHREADS];
    int i=0;
    int rc;

    for(i=0;i<5;i++)
    if(order_heap.empty())
        v[i]=i+1;
    else
        v[i]=(order_heap.removeMin())+1;
    for (i=0;i<32;i++)
    {
        threads_args[i]=i;
        rc=pthread_create(&threads[i],NULL,probSAT, (void *)&threads_args[i]);
    }
    pthread_exit(NULL);
    return;


}

【问题讨论】:

  • 编译器告诉你你的probSAT函数有错误的原型来作为pthread入口函数。更改函数的类型,消息就会消失。
  • Solver::p 看起来不像 C。确定你想要这篇标记为 C 的帖子吗?
  • 这不是C。请随意添加正确的标签。
  • 另外,参数指针指向的threads_args内存在线程访问时需要有效,但作为局部变量,不保证线程一定可以访问在它被摧毁之前。
  • 因为问题实际上出在你的 probSAT 函数上,包括这将有助于回答你的问题。

标签: c++ pthreads type-conversion


【解决方案1】:

定义为int (*)(void*) 的函数与定义为void* (*)(void*) 的函数不兼容。您需要将probSAT 定义为:

void *probSAT(void *);

如果你想从这个函数有效地返回一个int,你可以返回一个全局变量的地址,或者(更好的选择)为int分配空间并返回一个指向它的指针(并确保你加入线程时释放它)。

void *probSAT(void *param) {
    int *rval = malloc(sizeof(int));
    if (rval == NULL) {
        perror("malloc failed");
        exit(1);
    }
    ....
    *rval = {some value};
    return rval;
}


void get_thread_rval(pthread_t thread_id) 
{
    void *rval;
    int *rval_int;
    if (pthread_join(thread_id, &rval) != 0) {
        perror("pthread_join failed");
    } else {
        rval_int = rval;
        printf("thread returned %d\n", *rval_int);
        free(rval_int);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-02
    • 2017-06-30
    • 2013-08-19
    • 2011-06-29
    • 1970-01-01
    相关资源
    最近更新 更多