哎,我的博客真的没人看啊,到目前为止才有5个人看,其中一个还是版主,估计其他四个看了之后也是万分后悔啊,我忍,做技术的人就是要忍受寂寞

每次都觉得自己好肤浅,今天又碰到肤浅的问题了
就是线程创建时的问题
pthread_create
int pthread_create(pthread_t * thread, pthread_attr_t * attr,void * (*start_routine)(void *), void * arg);
可见,参数3是指向线程函数的函数指针。说白了参数是一个void *类型。
首先,我写了一个错误的代码,如下:
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
pthread_t thread_id=NULL;
int gps_proc()
{
  int i;
  for(i=0;i<10;i++)
  {
            printf("11111111111111111111111111111111111111111\n");
            sleep(1);
  }
  exit(0);//此处有错,因为exit退出了进程,应该是return 0;8.26 修正
}
int main( void )
{
    int ret;
    int i;
    ret=pthread_create(&thread_id,NULL,(int*)gps_proc(),NULL);
    if(ret!=0){printf("Create pthread error!\n");return -1;}
    for(i=0;i<10;i++)
    {
            printf("22222222222222222222222222222222222222222\n");
            sleep(1);
     }
     return 0;
}

编译没有任何错误,执行,

打印10行 111111111111111111111111111111
然后segmentfault
在高手的指点之下,我改正了,代码又如下:
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
pthread_t thread_id=NULL;
int gps_proc()
{
    int i;
    for(i=0;i<10;i++)
    {
            printf("11111111111111111111111111111111111111111\n");
            sleep(1);
    }
    exit(0);
}
int main( void )
{
     int ret;
     int i;
     ret=pthread_create(&thread_id,NULL,(int*)gps_proc,NULL);
     if(ret!=0){printf("Create pthread error!\n");return -1;}
     for(i=0;i<10;i++)
     {
            printf("22222222222222222222222222222222222222222\n");
            sleep(1);
     }
     return 0;
}

也就是说,在gps_proc后面的()去掉就行了

可是,为什么呢?
想想看,第三个参数是个void*,也就是说,它要的是一个地址,地址是什么,无非就是一个数值,
我们用gps_info()的时候,这是一个函数,调用的时候得到的是返回值,是个数值,编译的时候把它当地址对待,前面加 int* 的强制类型转化无非就是想说这个地址里面的内容读出时按int类型解读,组合。所以,我写成gps_info()是可以编译通过的,但是为什么只输出10行1111111111111111111111111,然后segmentfault的错误呢?因为要想得到这个函数的返回值,首先要把这个函数执行一遍先,所以,我们的函数就去执行了,执行了之后呢?返回0,我们认为这是地址0,可是地址0是什么呢?有没有被什么其他人预先用了呢?自然而然,就发生了segmentfault的错误。
而用 gps_info 这个表示的就是函数的地址,我们也可以理解为函数的入口地址啊,至于为什么正确,我就不做过错解释了,因为我们已经从错误中汲取了足够的教训。

转载于:https://blog.51cto.com/nnssll/195434

线程---pthread_creat的问题相关推荐

  1. c语言 ipc 参数 序列化,c语言编译原理及IPC通信经典面试题

    1. 1 大致描述一个进程在内存中的分布情况 1)代码区:储存程序代码 2)data段:已初始化的全局变量和static变量以及常量字符串.程序结束后自动释放 3)bss段:未初始化的全局变量和sta ...

  2. 多线程编程指南 part 2

    多线程编程指南 Sun Microsystems, Inc. 4150 Network Circle Santa Clara, CA95054 U.S.A. 文件号码819–7051–10 2006 ...

  3. Linux 多线程开发-线程创建pthread_creat

    1.函数原型 int pthread_creat(pthread_t *pid, const pthread_attr_t *attr,void *(*start_routine)(void *),v ...

  4. 创建线程:pthread_creat() 函数介绍

    创建线程:pthread_creat() 函数介绍 语法 : int pthread_creat(pthread_t *thread,const pthread_attr_t *attr,void * ...

  5. 应用退出前不让线程切换_用户级线程和内核级线程,你分清楚了吗?

    前天晚上有个伙伴私信我说在学进程和线程,问我有没有好的方法和学习教程,刚好我最近也在备相关的课. 班上不少学生学的还是很不错的.拿班上小白和小明的例子吧(艺名哈).小明接受能力很强,小白则稍差些. 关 ...

  6. Linux下简单线程池的实现

    线程池的技术背景 在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源.在Java中更是如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收.所以 ...

  7. muduo学习笔记 线程类

    learn_muduo 线程属性 线程标识 pthreadId_,pid_t 线程函数 func_ 线程名字 name_ 线程序号 numCreated_ bool started_; // 线程状态 ...

  8. clone的fork与pthread_create创建线程有何不同pthread多线程编程的学习小结(转)

    进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合,这些资源在Linux中被抽 象成各种数据对象:进程控制块.虚存空间.文件系统,文件I/O.信号处理函数.所以创建一个进程的 过程就是这 ...

  9. 线程创建-结束-回收 教程

    ps aux -L 查看线程信息 且显示进程状态 使用进程的缺点: 进程切换 系统开销较大 开销大的原因 :切换时需要频繁刷新 cache(类似于缓冲区) 和TLB linux不区分线程 进程 线程其 ...

  10. Linux 多线程开发-线程的结束pthread_kill和pthread_cancel

    1.线程结束的方式 (1)线程函数中调用pthread_exit函数,不会导致对象析构,可以使用 (2)线程所属的进程结束,进程调用exit,线程C++对象不会销毁,不安全,属于被动结束 (3)线程函 ...

最新文章

  1. javascript中 (function(){})();如何理解?
  2. android 自定义图形,Android自定义View之图形图像(模仿360的刷新球自定
  3. 删除highcharts.com点数链接
  4. python dash库_让你事半功倍的小众 Python 库
  5. 蓝牙BLE ATT剖析(一)
  6. 新东方财报背后:增收不增利之下,“下沉”“上线”能有坦途?
  7. jupyter 显示全部数据
  8. Android常用的一些make命令(转载)--不错
  9. Spring精华问答 | Spring框架有哪些主要模块?
  10. SoapUI 5.4.0 中文乱码
  11. 文件、文件夹操作(I)
  12. 计算机科学与技术专业热,广东省计算机科学与技术专业最“热”
  13. Android Studio下载安装及配置图文教程
  14. Enigma密码机初步解析
  15. 整人网页html语言网站,html愚人节整人一直弹的网页窗口怎么做?
  16. 二进制计量单位#K,M,G,T的换算
  17. java ftp 上传文件 无效_使用java进行ftp文件上传出现425错误
  18. sofa与springboot的入门案例
  19. JS下载喜马拉雅非付费音频
  20. 【电子存证】互联网企业存证需求与痛点

热门文章

  1. [转]用户空间和内核空间,进程上下文和中断上下文
  2. Linux常用文档操作命令--2
  3. OAuth 2和JWT - 如何设计安全的API?
  4. web form常用控件
  5. 敲一下enter键,完成iOS的打包工作
  6. 2016/7/7 设置wamp2.5 mysql密码 重点是mysql版本
  7. 088 菱形继承问题
  8. vue项目下,webpack.js/package.json配置
  9. 【mysql】关于IO/内存方面的一些优化
  10. 网站性能工具-YSlow的23个规则-网站性能优化