【Linux:线程控制】

目录

线程的创建与等待:

​编辑 代码中tid是什么?

如何看待线程函数传参?

 ​编辑

​编辑创建多线程:​编辑

终止多线程:

线程分离:

线程封装:


线程的创建与等待:

void *threadrun(void *args)
{int cnt=10;while(cnt){std::cout<<"new thread run ...cnt:"<<cnt--<<std::endl;sleep(1);}return nullptr;
}int main()
{pthread_t tid;int n=pthread_create(&tid,nullptr,threadrun,(void*)"thread 1");//创建线程if(n!=0){std::cout<<"create fail"<<std::endl;return 1;}std::cout<<"main thread join begin"<<std::endl;n=pthread_join(tid,nullptr);//主线程等待if(n==0){std::cout<<"main thread wait sucess"<<std::endl;//主线程等待成功}return 0;
}

主线程需要等待其他线程结束后再退出,避免僵尸进程等情况的出现,线程运行的顺序并不确定,是随机切换的 

 代码中tid是什么?

tid是一个虚拟地址。

tid并不是内核中的lwp,他是给用户提供的一个ID值。在进程概念中,谈及到库的加载问题,库存储在一个公共区域(共享区,位于栈和堆之间的区域)

  • 在内核空间中,动态库加载到共享区中
  • Pthread库加载后,在动态库中会为每一个线程分配一个内存块
  • 库对线程的管理,创建描述线程的结构体的属性字段,以“数组”的形式管理起来 
  • struct pthread中保存的是线程在用户级的基本属性
  • Linux线程=Linux线程属性集合+LWP
  • 每一个线程的中都有独立的栈结构

tid是库中的一个虚拟地址。以pthread_join()函数举例,为什么主线程能够join成功其他线程,这是因为join函数的参数中传入了需要等待的线程的tid值,通过tid找到该线程在库中的位置,进而返回给join 函数

如何看待线程函数传参?

 

第三个参数不止可以传任意类型,也可以传类对象的地址。

  • 当主线程正常运行,但其他线程出现异常,进程会直接终止。因此,线程函数只考虑正确的返回,不考虑异常的情况。
  • 线程函数返回不止可以返回任意类型,也可以传递任意对象的地址

创建多线程:

const int num=10;void *threadrun(void *args)
{std::string name=static_cast<const char*>(args);while(true){std::cout<<name<<"is running"<<std::endl;sleep(1);}
}
int main()
{std::vector<pthread_t>tips;//创建多线程for(int i=0;i<num;i++){//线程idpthread_t tid;char *name=new char[128];snprintf(name,128,"thread-%d",i+1);pthread_create(&tid,nullptr,threadrun,name);}sleep(100);

终止多线程:

主线程退出代表进程终止。

新线程退出方式:

  • 函数return
  •  exit:在多线程中,任意一个线程调用exit ,进程都会终止,因为exit是终止进程的,线程使用的exit叫做pthread_exit函数
  • main thread call pthread_cancel,新线程的退出结果是-1

线程分离:

一个线程被分离,线程的工作状态为分离状态,不需要被join 也不可以被join 

 C++11多线程

c++11多线程的本质就是对原生线程库接口 的封装

线程封装:

#include <iostream>
#include <string>
#include <unistd.h>
#include <pthread.h>
namespace threadmoudle
{typedef void (*func_t)(const std::string &name);class Thread{public:// Thread(const std:string &name,func_t func):_name(name),_func(func)// {// }Thread(const std::string &name, func_t func):_name(name), _func(func){std::cout << "create " << name << " done" << std::endl;}void Excute(){_func(_name);}static void  *ThreadRoutine(void *args){Thread *self=static_cast<Thread*>(args);//获取当前对象self->Excute();return nullptr;}bool start(){int n=::pthread_create(&_tid,nullptr,ThreadRoutine,this);if(n!=0)return false;return true;}std::string status(){if(_isrunning)return "thread run";else return "thread stop";}void stop(){if(_isrunning){pthread_cancel(_tid);_isrunning=false;}}void join(){if(!_isrunning){pthread_join(_tid,nullptr);}}std::string name(){return _name;}~Thread(){}private:std::string _name;pthread_t _tid;bool _isrunning;func_t _func;//线程执行的回调函数};

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

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

相关文章

在docker中安装并运行mysql8.0.31

第一步&#xff1a;命令行拉取mysql镜像 docker pull mysql:8.0.31查看是否拉取成功 docker images mysql:latest第二步&#xff1a;运行mysql镜像&#xff0c;启动mysql实例 docker run -p 3307:3307 -e MYSQL_ROOT_PASSWORD"123456" -d mysql:8.0.313307:3307前…

51单片机的智能水温控制系统【proteus仿真+程序+报告+原理图+演示视频】

1、主要功能 该系统由AT89C51/STC89C52单片机LCD1602显示模块温度传感器继电器LED和按键等模块构成。适用于智能热水器控制、泳池水温控制系统等相似项目。 可实现功能: 1、LCD1602实时显示水温信息和上下限 2、温度传感器DS18B20采集水体温度 3、当温度低于下限&#xff0…

Linux环境通过APT 仓库安装版PostgreSQL 数据库实战

Linux环境通过APT 仓库安装版PostgreSQL 数据库是运维人员常见的需求之一&#xff0c;今天我们一步一步演示一下&#xff1a; 1、添加 PostgreSQL APT 仓库 确保你的系统更新&#xff0c;然后添加 PostgreSQL 的官方 APT 仓库。 sudo apt update sudo apt install -y wget w…

基于MindSpore实现CycleGAN壁画修复

基于MindSpore实现CycleGAN壁画修复_哔哩哔哩_bilibili 本案例运行需要较大内存&#xff0c;建议在Ascend/GPU上运行。 模型介绍 模型简介 CycleGAN(Cycle Generative Adversarial Network) 即循环对抗生成网络&#xff0c;来自论文 Unpaired Image-to-Image Translation us…

大模型日报|7 篇必读的大模型论文

大家好&#xff0c;今日必读的大模型论文来啦&#xff01; 1.上交大团队新研究&#xff1a;像专家一样大规模提升预训练数据质量 大语言模型&#xff08;LLM&#xff09;的预训练历来依赖于人类专家为提高语料库质量而精心设计的启发式方法&#xff0c;迄今为止已开发出大量规…

SpringSession;基于Redis的SpringSession实现;实现session共享的三种方式

一&#xff0c;SpringSession简介 是SpringCloud下管理session的框架&#xff0c;在微服务架构中&#xff0c;由于应用了分布式的思想&#xff0c;session无法做到内存中互通&#xff0c;需要一个框架来实现各个微服务中session数据共享&#xff0c;SpringSession解决了这个问题…

城市交通场景分割系统源码&数据集分享

城市交通场景分割系统源码&#xff06;数据集分享 [yolov8-seg-C2f-Faster&#xff06;yolov8-seg-GhostHGNetV2等50全套改进创新点发刊_一键训练教程_Web前端展示] 1.研究背景与意义 项目参考ILSVRC ImageNet Large Scale Visual Recognition Challenge 项目来源AAAI Glob…

信创一定要了解的知识

什么是信创 定义 信创&#xff0c;全称为信息技术应用创新产业&#xff0c;旨在发展国产信息产业&#xff0c;减少对国外技术的依赖&#xff0c;实现软硬件的国产替代化。信创产业是数字经济的关键支撑&#xff0c;涵盖从基础硬件到应用软件的全产业链。 产业范畴 信创产业…

C0015.Clion中开发C++时,连接Mysql数据库方法

安装mysql数据库 CMakeLists.txt中配置mysql数据库 # 先指定mysql数据库的安装位置 include_directories("C:/Program Files/MySQL/MySQL Server 8.0/include") link_directories("C:/Program Files/MySQL/MySQL Server 8.0/lib") link_libraries(libmysq…

AI会计师——让AI+成就价值财务

摘要&#xff1a;用友携手CCTV-10联合策划《AI会计师》专题节目 目录 Part1 数智化凭证采集 Part2 智能月结 Part3 税务风险管控 Part1 数智化凭证采集 AI会计师&#xff0c;源自对大数据、人工智能、云计算等前沿技术的深度融合。它不仅仅是一款软件&#xff0c;更是企业智能…

Python基础之List列表用法

1、创建列表 names ["张三","李四","王五","Mary"] 2、列表分片 names[1]&#xff1a;获取数组的第2个元素。 names[1:3]&#xff1a;获取数组的第2、第3个元素。包含左侧&#xff0c;不包含右侧。 names[:3]等同于names[0:3]&…

大模型推理框架llama.cpp开发流程和常用函数介绍

llama.cpp是一个高性能的CPU/GPU大语言模型推理框架&#xff0c;适用于消费级设备或边缘设备。开发者可以通过工具将各类开源大语言模型转换并量化成gguf格式的文件&#xff0c;然后通过llama.cpp实现本地推理。经过我的调研&#xff0c;相比较其它大模型落地方案&#xff0c;中…

AI时代的直播革命!洞察数字化趋势,从今日开启你的AIGC旅程!

AI时代的直播革命&#xff01;洞察数字化趋势&#xff0c;从今日开启你的AIGC旅程&#xff01; 在AI技术日新月异的今天&#xff0c;直播行业正经历着一场前所未有的革命。这场革命不仅深刻改变了内容创作、传播与消费的方式&#xff0c;更预示着未来数字化时代娱乐与商业互动的…

PCL 计算点云AABB包围盒(惯性矩阵)

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1 计算AABB包围盒 2.1.2 可视化点云与AABB包围盒 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接&#xff1a; PCL点云算法与项目实战案例汇总&#xff08;长…

Java 集合实现类

Java 集合实现类 ​ Java 提供了一套实现了 Collection 接口的标准集合类。其中一些是具体类&#xff0c;这些类可以直接拿来使用&#xff0c;而另外一些是抽象类&#xff0c;提供了接口的部分实现 序号类描述1AbstractCollection 实现了大部分的集合接口。2AbstractList 继承…

【EXCEL数据处理】000021 案例 保姆级教程,附多个操作案例。EXCEL文档安全性设置。

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 【EXCEL数据处理】000021 案例 保姆级教程&#xff0c;附多个操作案例。…

算法:双指针系列(一)

双指针系列 一、移动零&#xff08;一&#xff09;题目分析&#xff08;二&#xff09;代码展示二、复写零&#xff08;一&#xff09;题目分析&#xff08;二&#xff09;代码展示三、快乐数&#xff08;一&#xff09;题目分析&#xff08;二&#xff09;代码展示 一、移动零…

【C++】模拟实现hash_table(哈希表)

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:实战项目集 ⚙️操作环境:Visual Studio 2022 目录 一.了解项目功能 二.逐步实现项目功能模块及其逻辑详解 &#x1f4cc;实现HashNode类模板 &#x1f38f;构造HashNode类成员变量 &#x1f38f;实现HashNode类构造函数…

Python【修炼2】

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;折纸花满衣 &#x1f3e0;个人专栏&#xff1a;Python 目录 &#x1f449;&#x1f3fb;map&#x1f449;&#x1f3fb;lambda&#x1f449;&#x1f3fb;datetime日期输出格式 &#x1f449;&#x1f3fb…

Pikachu-PHP反序列化

从后端代码可以看出&#xff0c;拿到序列化后的字符串&#xff0c;直接做反序列化&#xff1b;并且在前端做了展示&#xff1b; 如果虚拟化后的字符串&#xff0c;包含alert 内容&#xff0c;反序列化后&#xff0c;就会弹出窗口 O:1:"S":1:{s:4:"test";s…