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

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

目录

  • pthread_create 与 pthread_join:
    • pthread_create:
    • pthread_join:
  • 代码:
    • 问题一:主线程与新线程谁先退出?
    • 问题二:哪个线程应该最后退出?
    • 问题三:tid是什么样子的?
    • 问题四:怎么更好的理解新线程函数的传参?

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函数修改一下打印即可。
在这里插入图片描述
现象:
在这里插入图片描述
这就意味着我们可以给线程传递多个参数甚至是方法。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/29201.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenCV读取和显示和保存图像

# 导入 OpenCV import cv2 as cv # 读取图像 image cv.imread(F:\\mytupian\\xihuduanqiao.jpg) # 创建窗口 #显示图像后,允许用户随意调整窗口大小 cv.namedWindow(image, cv.WINDOW_NORMAL) # 显示图像 cv.imshow(image, image)# 将图像保存到文件 success cv…

Centos部署openGauss6.0创新版本,丝滑的体验

作者:IT邦德 中国DBA联盟(ACDU)成员,10余年DBA工作经验, Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主,全网粉丝10万 擅长主流Oracle、MySQL、PG、高斯及Greenplum备份恢复, 安装迁移,性能优化、故障…

同三维T80004EHL-W-4K30 4K HDMI编码器,支持WEBRTC协议

输入:1路HDMI1路3.5音频,1路HDMI环出1路3.5音频解嵌输出 4K30超高清,支持U盘/移动硬盘/TF卡录制,支持WEBRTC协议,超低延时,支持3个点外网访问 1个主流1个副流输出,可定制选配POE供电模块,WEBR…

理解CA-IS3050G高速CAN收发器的CANH和CANL的电压

CA-IS3050G高速CAN收发器符合ISO 11898-2物理层标准。 1、CANH和CANL的电压之和为5V&#xff0c;下图是CA-IS3050G的高速CAN收发器参数&#xff0c;分析如下&#xff1a; 1&#xff09;、总线输出显性电压 2.75V < VCANH <4.5V&#xff0c;负载为60Ω&#xff0c;CANH…

Proxy和definedProperty

1. Proxy 代理 定义: 用于定义基本操作的自定义行为 Proxy修改的是程序默认形为&#xff0c;就形同于在编程语言层面上做修改&#xff0c;属于元编程 元编程 是指某类计算机程序的编写&#xff0c;这类计算机程序编写或者操纵其它程序&#xff08;或者自身&#xff09;作为它…

leetcode 1355 活动参与者(postgresql)

需求 表: Friends ---------------------- | Column Name | Type | ---------------------- | id | int | | name | varchar | | activity | varchar | ---------------------- id 是朋友的 id 和该表的主键 name 是朋友的名字 activity 是朋友参加的活动的名字 表: Activit…

QT实现多摄像头监控

工具使用方法&#xff1a; 1、在add camera后面输入对应摄像头的IP后&#xff0c;点击add会自动布局显示。 2、在del camera后选择一个对应IP后&#xff0c;点击del会自动删除对应摄像头的显示&#xff0c;且整体布局会自动调整。 工具使用场景&#xff1a; 测试摄像头的好坏。…

探索CSS clip-path: polygon():塑造元素的无限可能

在CSS的世界里&#xff0c;clip-path 属性赋予了开发者前所未有的能力&#xff0c;让他们能够以非传统的方式裁剪页面元素&#xff0c;创造出独特的视觉效果。其中&#xff0c;polygon() 函数尤其强大&#xff0c;它允许你使用多边形来定义裁剪区域的形状&#xff0c;从而实现各…

Redis常见数据类型及其常用命令详解

文章目录 一、Redis概述二、Redis常用命令1.通用命令1.1 KEYS&#xff1a;查看符合模板的所有 key1.2 DEL&#xff1a;删除一个指定的 key1.3 EXISTS&#xff1a;判断 key 是否存在1.4 EXPIRE&#xff1a;给一个 key 设置有效期&#xff0c;有效期到期时该 key 会被自动删除1.5…

【读博日记】拓扑结构(待修正)

Topology 拓扑学 内容来源于互联网&#xff0c;还在甄别中——20240617 拓扑结构指把实体抽象成与其形状大小无关的点&#xff0c;把连接实体的线路抽象成线&#xff0c;再研究这些电线之间的关系。 所谓相似的拓扑结构&#xff1a; 例如一个圆环变成正方形、长方形、三角形…

.Net OpenCVSharp生成灰度图和二值图

文章目录 前言一、灰度图二、二值图 前言 使用OpenCVSharp生成图片的灰度图和二值图 .Net 8.0版本&#xff0c;依赖OpenCvSharp4和OpenCvSharp4.runtime.win组件。 原图&#xff1a; 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、灰度图 /// &…

efficientsam-pytorch基于point、box和segment everthing推理模型

EfficientSAM 论文 EfficientSAM: Leveraged Masked Image Pretraining for Efficient Segment Anything https://arxiv.org/abs/2312.00863 模型结构 EfficientSAM模型利用掩码图像预训练&#xff08;SAMI&#xff09;&#xff0c;该预训练学习从SAM图像编码器重构特征&a…

项目(一)--高并发内存池项目简介

什么是高并发内存池 它是一个全球性大厂google(谷歌)的 开源项目,项目名字叫tcmalloc,全称是Thread-Caching Malloc,即线程缓存的malloc 作用&#xff1a; 我们知道C语言在堆上开辟空间和 释放使用的是malloc和free函数 并且C的动态内存管理new和delete 的底层实际上也调用了…

【Linux】模拟实现一个简单的日志系统

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前正在学习c和算法 ✈️专栏&#xff1a;Linux &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章有啥瑕疵&#xff0c;希望大佬指点一二 如果文章对…

SFNC —— 标准特征命名约定(一)

系列文章目录 SFNC —— 标准特征命名约定&#xff08;一&#xff09; 文章目录 系列文章目录1、介绍1.1 约定&#xff08;Conventions&#xff09;功能名称和接口&#xff08;Feature Name and Interface&#xff09;功能类别&#xff08;Feature Category&#xff09;功能级别…

(微服务实战)预付卡平台支付交易系统消费业务流程设计

1 交易系统技术架构 预付卡支付交易系统采用Dubbo3作为底层框架&#xff0c;支付交易系统分为账户系统、清结算系统、支付网关、核心支付系统等模块。系统整体采用微服务架构&#xff0c;容器化部署。 2 消费业务流程设计 预付卡系统消费场景分为线上和线下&#xff0c;线…

市场情绪周期2024-6-17(补涨回头潮视角验证)

竞价隔夜单 看长江通信&#xff0c;38亿涨到40亿又回落&#xff0c;那么周末最大的利好消息加持下&#xff0c;隔夜单不及预期&#xff0c;金溢科技 更是如此&#xff1b;空间板华闻集团8天7板&#xff0c;连扳5板&#xff0c;一字跌停&#xff0c;它也是有车联网的&#xff0c…

【UIDynamic-动力学-UICollisionBehavior-碰撞模式-创建边界 Objective-C语言】

一、我们来说这个碰撞模式 1.把之前的代码备份一下,改个名字:“04-碰撞行为-碰撞模式”, 然后,command + R,先跑一下, 我现在,一点击,是这个红色的View、和蓝色的View、在发生碰撞, 我们说,碰撞模式是啥意思, collision里边,有一个叫做collisionMode, UICollis…

c++里对 new 、delete 运算符的重载

&#xff08;1&#xff09;c 里 我们可以用默认的 new 和 delete 来分配对象和回收对象。 new 可以先申请内存&#xff0c;再调用对象的构造函数&#xff1b; delete 则先调用对象的析构函数&#xff0c;再回收内存。当然&#xff0c;当我们为类定义了 operator new () 和 oper…