zoukankan      html  css  js  c++  java
  • 【Linux开发技术之常见问题】一个建立线程时常见的问题:invalid conversion from `void*' to `void*(*)(void*)

    作者:gnuhpc 
    出处:http://www.cnblogs.com/gnuhpc/

    void main_thread ( void *ptr )
    {
      char *message1 = "Thread 1";
      char *message2 = "Thread 2";
      pthread_t thread3, thread4;
      int iret3, iret4;
      iret3 = pthread_create(&thread3, NULL, (void *)&print_message_function, (void *) message1);
      iret4 = pthread_create(&thread4, NULL, (void *)&print_message_function, (void *) message2);
    }
    void print_message_function( void *ptr )
    {
         char *message;
         message = (char *) ptr;
         printf("%s /n", message);
    }
    以上这段代码在用g++编译是会有如下错误:
    invalid conversion from `void*' to `void*(*)(void*)
    我们注意在Posix定义建立线程函数的原型:
    extern int pthread_create (pthread_t *__restrict __threadp,
                               __const pthread_attr_t *__restrict __attr,
                               void *(*__start_routine) (void *),
                               void *__restrict __arg) __THROW;
    这个call中的第三个参数是载入一个函数,这个函数有一个参数可以传入,返回一个 通用指针。
    我们再来看看原来函数中是怎样调用这一原型的,基本上就是类似一下的调用方式:
    (void *)&main_thread
    这个表达式的含义:取一个指向函数main_thread的指针,然后将其转换为一个通用指针。
    这就是说显然上述两个事情并非同一个事情,故而正确的调用方式是
      iret3 = pthread_create(&thread3, NULL, print_message_function, (void *) message1);
    处理函数的定义如下:
    void* print_message_function( void *ptr )


                   作者:gnuhpc
                   出处:http://www.cnblogs.com/gnuhpc/
                   除非另有声明,本网站采用知识共享“署名 2.5 中国大陆”许可协议授权。


    分享到:

  • 相关阅读:
    LCD实验学习笔记(八):中断
    LCD实验学习笔记(七):NAND FLASH
    LCD实验学习笔记(六):存储控制器
    LCD实验学习笔记(五):MMU
    博客已经迁移
    什么是全栈工程师
    深入解析Django Admin模块
    Firefox OS 指导方针-字体
    Firefox OS 指导方针-调色板
    Firefox OS 指导方针-简介
  • 原文地址:https://www.cnblogs.com/gnuhpc/p/2324804.html
Copyright © 2011-2022 走看看