【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 = "Threa...

作者: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 中国大陆”许可协议授权。


分享到:

目录
相关文章
|
2月前
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
106 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
2月前
|
资源调度 Linux 调度
Linux C/C++之线程基础
这篇文章详细介绍了Linux下C/C++线程的基本概念、创建和管理线程的方法,以及线程同步的各种机制,并通过实例代码展示了线程同步技术的应用。
33 0
Linux C/C++之线程基础
|
2月前
|
Linux 虚拟化
Vmware 傻瓜式安装(不可不知道的Linux基础知识和技术 01)
本文介绍了VMware虚拟机的下载与安装步骤。首先,通过提供的网盘链接下载VMware安装包。接着,详细描述了安装流程,包括接受协议、选择安装路径(建议避免系统C盘)、取消更新选项等。最后,输入许可证密钥完成安装,并展示了打开虚拟机后的主界面。整个过程简单易懂,适合新手操作。
150 1
|
2月前
|
安全 Linux
Linux线程(十一)线程互斥锁-条件变量详解
Linux线程(十一)线程互斥锁-条件变量详解
|
3月前
|
安全 Linux Android开发
Linux CFI (Control-flow integrity)技术相关资料汇总
Linux CFI (Control-flow integrity)技术相关资料汇总
|
3月前
|
存储 Linux 开发工具
如何进行Linux内核开发【ChatGPT】
如何进行Linux内核开发【ChatGPT】
|
4月前
|
Java Linux API
Linux设备驱动开发详解2
Linux设备驱动开发详解
51 6
|
4月前
|
消息中间件 算法 Unix
Linux设备驱动开发详解1
Linux设备驱动开发详解
55 5
|
4月前
|
存储 监控 Linux
在Linux中,如何进行虚拟化技术的应用?
在Linux中,如何进行虚拟化技术的应用?
|
4月前
|
存储 分布式计算 负载均衡
在Linux中,什么是集群,并且列出常见的集群技术。
在Linux中,什么是集群,并且列出常见的集群技术。