【Linux】线程(二:线程控制)

本篇文章主要围绕线程控制来进行展开。
主题思路是以create与join两个接口展开。

pthread_create 与 pthread_join:

现在只是粗略的了解一下create与join这个函数的参数与返回值:

pthread_create:

这是进行线程创建的函数
在这里插入图片描述
参数一:
他是一个输出型参数,为线程的id,这是库提供的类型,本是一个无符号长整型。在这里插入图片描述
参数二:
这个是关于线程属性的,不会用到,我们写为nullptr即可。
参数三:
是一个函数指针,是我们新线程要去执行的函数。
参数四:
传参给参数三中的函数。

关于返回值,带有pthread前缀的函数返回值都是统一的:
成功时返回0,失败时返回错误码。

pthread_join:

我们的进程需要等待,线程当然也需要进行等待,join就是。
在这里插入图片描述
参数一:
将指定tid传给他即可。
参数二:
这是接收新线程执行函数的返回值,我们暂时不关心,先设置为nuliptr。

随后会围绕这两个函数进行展开,细节都会涉及到。

代码:

进程控制本质上就是一堆的函数调用,我们当然是要结合代码来看。

问题一:主线程与新线程谁先退出?

我们先写一段最简单的代码:
在这里插入图片描述
观察现象:
在这里插入图片描述
那么这里后出现一个问题,也就是我们的问题一。
在这里插入图片描述
所以应该谁先运行,答案是不确定的,
因为它取决于OS的调度策略与运气等因素,好吧…

问题二:哪个线程应该最后退出?

与我们的进程一样,进程需要父进程来进行等待,所以父进程应最后退出;
线程也应该是主线程最后退出,进行对应的等待。

那么怎么保证他可以最后退出?答案就是join会进行阻塞等待。

如果主线程不进行join?
当主线程退了,那么整个进程就相当于退出了。我们不推荐这种做法,这样的行为是没有意义的。
当主线程没退,新线程跑完,会出现类似僵尸进程的概念。

对于join可以进行等待我们可以验证一下:

在这里插入图片描述
对threadRun进行修改一下即可。
利用命令:while ;: do ps -aL ; sleep 1; done进行观察,果然过了5s后都退出了。
在这里插入图片描述

问题三:tid是什么样子的?

我们已经说过他的本质是一个无符号数字,我们来看看:
他是什么样子。

在这里插入图片描述
打印出来是个很大的数字?
在这里插入图片描述
为什么和我们的LWP不一样?
tid实际上是一个虚拟地址,更具体一些的需要等等再说。

问题四:怎么更好的理解新线程函数的传参?

我们已经实验过使用对于传参我们可以传一个字符串,进行强转就可以使用,那么我们可以穿内置类型指针,甚至自定义类型指针?

我们一步一步来看,先来看内置类型的。

我们先在栈中定义一个变量a,将他的地址强转为void*传给函数。
在这里插入图片描述

现象:果然循环5次打印10。
在这里插入图片描述
那么自定义类型?

代码:
在这里插入图片描述

在这里插入图片描述
对于ThreadRun函数修改一下打印即可。
在这里插入图片描述
现象:
在这里插入图片描述
这就意味着我们可以给线程传递多个参数甚至是方法。

但是我们这样写的代码还有一个问题,因为

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-18 06:18:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-18 06:18:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-06-18 06:18:01       82 阅读
  4. Python语言-面向对象

    2024-06-18 06:18:01       91 阅读

热门阅读

  1. antd vue 输入框基础案例

    2024-06-18 06:18:01       23 阅读
  2. 课时158:脚本发布_简单脚本_远程执行

    2024-06-18 06:18:01       30 阅读
  3. vue 修改页面 刷新页面 增删改 provide / inject

    2024-06-18 06:18:01       39 阅读
  4. Elasticsearch在日志分析中的神奇之旅

    2024-06-18 06:18:01       34 阅读
  5. super().__init__()的解析和作用

    2024-06-18 06:18:01       32 阅读
  6. awtk界面实现下拉屏功能

    2024-06-18 06:18:01       39 阅读
  7. linux 压缩命令之tar工具的基本使用

    2024-06-18 06:18:01       36 阅读
  8. 【Linux】I/O多路复用

    2024-06-18 06:18:01       37 阅读