线程创建当中遇到的一些自我理解

首先说明一下我们的线程是在Linux下创建的,即pcb模拟线程。

  • 扫一眼man手册里面的用法说明

在这里插入图片描述

创建线程
int pthread_create(pthread_t *thread, pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
thread: 用于获取线程id(用户态的线程id)
attr: 设置线程属性,通常置NULL
start_routine:线程入口函数,线程所运行的代码
arg: 线程入口函数的参数
返回值:成功:0 失败:非0

看一段创建的代码然后在说一下遇到的坑

在这里插入图片描述

  • 然后我们vim makefile,准备运行了,发现怎么都运行不了
  • 检查代码怎么也没有发现错误

在这里插入图片描述

  • 显示这个报错我们还以为是没有定义,怎么找也找不到错误

  • 最后makefile一下,终于还是发现了错误
    在创建多线成时候一定要添加动态库啊
    这个一定要记住,要不是半天都找不到错误,如果是和我一样的菜鸡
    在这里插入图片描述
    添加动态库-pthread以后我们的代码运行,发现就没有问题了
    这里为什么进程我们一般情况下不需要添加这个动态库了,但是线程就需要添加了,这里是自己的一些简单看法。

  • 先看一张画的很丑,很简陋的代码在内存中存储发布图吧。
    在这里插入图片描述

  • 我用红色标记了一个tid创建线程时候需要的返回值

  • 我们需要理解的是我们的动态库可以在多个进程之间共享,使用动态库链接是的可执行文件更小,节省了磁盘空间。操作系统采用虚拟导致内存机制允许物理内存中一份动态库被要用到该库的所有进程共用,节省了内存和磁盘空间。

  • 动态库链接的仅仅是执行文件人口函数的一个表,所以在线程创建为了取得线程之间关联性,这个tid线程的返回地址非常重要。

  • 我们的线程中动态库指向在共享区,这个tid返回值在线程共享区首地址位置,然后通过这个动态链接执行可执行程序。

猜你喜欢

转载自blog.csdn.net/sing_Hwang/article/details/85223823
今日推荐