Linux(一)线程——何为线程???Linux线程控制

news2024/7/31 3:36:30

文章目录

  • 什么是线程???
  • 线程和进程的区别和联系
  • Linux线程控制
    • POSIX线程库
    • 创建线程
    • 线程等待
    • 线程终止
    • 线程分离

什么是线程???

  • 在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控制序列”
  • 一切进程至少都有一个执行线程
  • 线程在进程内部运行,本质是在进程地址空间内运行
  • 在Linux系统中,在CPU眼中,看到的PCB都要比传统的进程更加轻量化
  • 透过进程虚拟地址空间,可以看到进程的大部分资源,将进程资源合理分配给每个执行流,就形成了线程执行流

在这里插入图片描述

每个进程都有自己独立的进程地址空间和独立的页表

如果我们在创建“进程”时,只创建task_struct,并要求创建出来的task_struct和父task_struct共享进程地址空间和页表

在这里插入图片描述

此时我们创建是四个线程:

  • 其中每一个线程都是当前进程里面的一个执行流,也就是我们常说的“线程是进程内部的一个执行分支”
  • 同时我们也可以看出,线程在进程内部运行,本质就是线程在进程地址空间内运行,也就是几乎都是被所有线程共享的

所以,线程就是一个没有独立的地址空间的task_struct结构,线程的资源是从最开始的主线程,也就是进程来的

CPU调度的是task_struct,并不关心此task_struct是进程的还是线程的,所以线程被称为系统调度的基本单位.而在Linux操作系统下,线程就是轻量化的进程

线程和进程的区别和联系

线程有下面的信息

  • 线程ID
  • 一组寄存器
  • errno
  • 信号屏蔽字
  • 调度优先级

进程的多个线程共享 同一地址空间,因此Text Segment、Data Segment都是共享的,如果定义一个函数,在各线程中都可以调用,如果定义一个全局变量,在各线程中都可以访问到,除此之外,各线程还共享以下进程资源和环境:

  • 文件描述符表
  • 每种信号的处理方式(SIG_ IGN、SIG_ DFL或者自定义的信号处理函数)
  • 当前工作目录
  • 用户id和组id

进程和线程的关系如下图:
在这里插入图片描述

那我们之前说的进程又是什么呢?
在这里插入图片描述

Linux线程控制

POSIX线程库

  • 与线程有关的函数构成了一个完整的系列,绝大多数函数的名字都是以“pthread_”打头的
  • 要使用这些函数库,要通过引入头文<pthread.h>
  • 链接这些线程函数库时要使用编译器命令的“-lpthread”选项

线程ID的本质是一个地址,pthread库是一个动态库,是个第三方库,这个库会被映射到进程的地址空间的共享区中

创建线程

pthread_create函数

int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);

参数:

  • thread:返回线程ID
  • attr:设置线程的属性,attr为NULL表示使用默认属性
  • start_routine:是个函数地址,线程启动后要执行的函数
  • arg:传给线程启动函数的参数

返回值:

  • 成功返回0
  • 失败返回错误码

例子:

void *route(void *arg) 
{
	while(1) 
	{
		printf("I'am a thread \n");
		sleep(1);
	}
}
int main()
{
	pthread_t tid;
	int ret;
	if ( (ret=pthread_create(&tid, NULL, rout, NULL)) != 0 ) 
	{
		fprintf(stderr, "pthread_create : %s\n", strerror(ret));
		exit(-1);
	}

	while(1) 
	{
		printf("I'am main thread\n");
		sleep(1);
	}
	
	return 0;
}

线程等待

为什么要线程等待???

已经退出的线程,其空间没有被释放,仍然在进程的地址空间内
创建新的线程不会复用刚才退出线程的地址空间

pthread_cancel函数

int pthread_join(pthread_t thread);

参数:

  • thread:线程ID
  • value_ptr:它指向一个指针,后者指向线程的返回

返回值:

  • 成功返回0
  • 失败返回错误码

线程终止

  • 从线程函数return。这种方法对主线程不适用,从main函数return相当于调用exit
  • 线程可以调用pthread_ exit终止自己
  • 一个线程可以调用pthread_ cancel终止同一进程中的另一个线程

pthread_exit函数

void pthread_exit(void *value_ptr);

参数:

  • value_ptr:value_ptr不要指向一个局部变量

返回值:

  • 无返回值,跟进程一样,线程结束的时候无法返回到它的调用者

pthread_cancel函数

int pthread_cancel(pthread_t thread);

参数:

  • thread:线程ID

返回值:

  • 成功返回0
  • 失败返回错误码

常使用return终止进程

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#include <sys/types.h>

void* Routine(void* arg)
{
	char* msg = (char*)arg;
	int count = 0;
	while (count < 10)
	{
		printf("I am %s---pid: %d, ppid: %d\n", msg, getpid(), getppid());
		sleep(1);
		count++;
	}
	
	return NULL;
}
int main()
{
	pthread_t tid[5];
	for (int i = 0; i < 5; i++)
	{
		char* buffer = (char*)malloc(64);
		sprintf(buffer, "thread %d", i);
		pthread_create(&tid[i], NULL, Routine, buffer);
		printf("%s tid is %lu\n", buffer, tid[i]);
	}
	printf("I am main thread...pid: %d, ppid: %d\n", getpid(), getppid());
	
	for (int i = 0; i < 10; i++)
	{
		pthread_join(tid[i], NULL);
		printf("thread %d[%lu]...quit\n", i, tid[i]);
	}
	return 0;
}

线程分离

  • 默认情况下,新创建的线程是joinable的,线程退出后,需要对其进行pthread_join操作,否则无法释放资源,从而造成系统泄漏
  • 如果不关心线程的返回值,join是一种负担,这个时候,我们可以告诉系统,当线程退出时,自动释放线程资源

pthread_detach函数

int pthread_detach(pthread_t thread);

自己分离
pthread_detach(pthread_self());

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>

void *thread_run( void * arg )
{
	pthread_detach(pthread_self());
	printf("%s\n", (char*)arg);
	
	return NULL;
} 

int main( void )
{
	pthread_t tid;
	if ( pthread_create(&tid, NULL, thread_run, "thread1 run...") != 0 ) 
	{
		printf("create thread error\n");
		return 1;
	} 
	int ret = 0;
	sleep(1);// 让线程先分离,再等待
	if ( pthread_join(tid, NULL ) == 0 ) 
	{
		printf("pthread wait success\n");
		ret = 0;
	} 
	else 
	{
		printf("pthread wait failed\n");
		ret = 1;
	} 
	return ret;
}

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

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

相关文章

Airtest成功案例分享:KLab连续2年携Airtest私有云产品参加CEDEC大会!

一、KLab株式会社介绍 KLab株式会社是一家位于日本的移动游戏开发公司&#xff0c;成立于2000年。公司以开发和运营基于动漫和漫画IP的手机游戏而闻名&#xff0c;尤其是在音乐节奏游戏领域。KLab的一些知名作品包括《LoveLive!学园偶像祭》、《排球少年&#xff1a;新的征程》…

【Redis】Redis十大类型

文章目录 前言一、string字符串类型二、List列表类型三、 Hash表四、 Set集合五、 ZSet有序集合六、 GEO地理空间七、 HyperLogLog基数统计八、Bitmap位图九、bitfield位域十、 Stream流10.1 队列指令10.2 消费组指令10.3 ACK机制 前言 redis是k-v键值对进行存储&#xff0c;k…

c#中的设计模式

1、设计模式 MVVM、MVC、GOF23种设计模式 2、GOF23种设计模式分类 创建型&#xff1a;对类的现实化进行了抽象&#xff0c;能够使软件模块做到与对象的创建和组织无关。 包括&#xff1a;单例模式、抽象工厂模式、建造者模式、工厂模式、原型模式 结构型&#xff1a;描述类…

PHP充电桩小程序系统源码

绿色出行新伴侣&#xff01;充电桩小程序&#xff0c;让充电不再烦恼✨ &#x1f50b; 开篇&#xff1a;告别电量焦虑&#xff0c;充电桩小程序来救场&#xff01; 在这个电动车日益普及的时代&#xff0c;电量不足成了不少车主的“心头大患”。但别担心&#xff0c;充电桩小…

基于IDEA的Lombok插件安装及简单使用

lombok介绍 Lombok能以注解形式来简化java代码&#xff0c;提高开发效率。开发中经常需要写的javabean&#xff0c;都需要花时间去添加相应的getter/setter&#xff0c;也许还要去写构造器、equals等方法&#xff0c;而且需要维护。而Lombok能通过注解的方式&#xff0c;在编译…

Redis 主从复制,、哨兵与集群

目录 一.redis主从复制 1.redis 主从复制架构 2.主从复制特点 3.主从复制的基本原理 4.命令行配置 5.实现主从复制 6.删除主从复制 7.主从复制故障恢复 8.主从复制完整过程 9.主从同步优化配置 二.哨兵模式&#xff08;Sentinel&#xff09; 1.主要组件和概念 2.哨…

利用Python的sympy包求解一元多次方程

一元1次方程 import sympy as sp # 导入sympy包 x sp.Symbol(x) # 定义符号变量 f 2*x -8 # 定义要求解的一元1次方程 x sp.solve(f) # 调用solve函数求解方程 x[4]一元2次方程 import sympy as sp # 导入sympy包 x sp.Symbol(x) # 定义符号变量 f …

无人直播赚钱的底层逻辑是什么?一文揭晓!

当前&#xff0c;网络直播已经成为各类商家提高曝光和引流获客的主要渠道之一&#xff0c;这在为商家带来新机遇的同时&#xff0c;也让他们因人手不足或资金匮乏等原因而陷入无人问津窘境之中。在此背景下&#xff0c;无人直播软件一经出现&#xff0c;便引起了众多商家的关注…

【解密】记一次辽宁省某综合实践教学管理平台加解密算法分析

最近接到需求&#xff0c;于是准备弄一下&#xff0c;发现对方整个流程是&#xff1a;先加密在请求&#xff0c;请求得到的数据再进行拼接加密&#xff0c;不过花了2个小时还是完成了解密 哈哈 找到请求发现请求数据加密 在启动器里面发现登录方法 打印出各个关键变量数据 …

docs | 使用 sphinx 转化rst文件为html文档

1. 效果图 book 风格。 优点&#xff1a; 极简风格右边有标题导航左侧是文件导航&#xff0c;可隐藏 2. 使用方式 reST 格式&#xff0c;比markdown格式更复杂。 推荐使用 book 风格。 文档构建工具是 sphinx&#xff0c;是一个python包。 $ pip3 list | grep -i Sphinx …

嵌入式ARM控制器在AGV里的应用

随着ARM技术以及芯片加工工艺的迅猛发展&#xff0c; ARM工业计算机得到了越来越广泛的应用&#xff0c;尤其在工业智慧城市、智能设备以及工业自动化控制等领域。本文将为大家详细介绍ARM控制器在AGV控制系统中的应用&#xff0c;来供大家学习和参考&#xff0c;欢迎大家一起来…

开源公司网站源码系统,降低成本,提升效率 附带完整的安装代码包以及搭建教程

系统概述 开源公司网站源码系统是一个基于开源技术的网站建设解决方案。它提供了完整的网站框架和功能模块&#xff0c;允许企业快速搭建起一个功能齐全、设计美观的企业网站。该系统不仅降低了网站开发的成本&#xff0c;还大大提高了建设效率&#xff0c;使企业能够更快地将…

便携式气象参数检测仪:智能气象监测

随着科技的飞速发展&#xff0c;气象监测已不再是传统意义上的固定站点观测&#xff0c;而是逐渐向智能化、便携化、高精度化方向演进。在这一背景下&#xff0c;便携式气象参数检测仪应运而生&#xff0c;以其轻便、高效、多功能的特性&#xff0c;成为气象监测领域的得力助手…

css实现图片渐变切换效果

一、效果 使用csskeyframes&#xff0c;实现5个图片渐变切换的效果。如下图&#xff1a; 二、代码 1.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"w…

【启明智显分享】乐鑫HMI方案4.3寸触摸串口屏:水质检测仪应用解决方案

水是万物的源泉&#xff0c;了解水的酸碱度对于保障我们的健康、生产和生活环境至关重要。水质检测仪应运而生&#xff0c;它让我们能够洞察水的酸碱奥秘。 水是万物的源泉&#xff0c;了解水的酸碱度对于保障我们的健康、生产和生活环境至关重要。水质检测仪应运而生&#xff…

成都云飞浩容文化传媒有限公司电商服务的行业翘楚

在数字经济的浪潮中&#xff0c;电商行业正以前所未有的速度发展&#xff0c;各大企业纷纷寻求突破&#xff0c;以在激烈的市场竞争中站稳脚跟。而在这个大背景下&#xff0c;成都云飞浩容文化传媒有限公司&#xff08;以下简称“云飞浩容”&#xff09;凭借其专业的电商服务&a…

网页设计零基础入门:前端技术全攻略

在当今互联网飞速发展的时代&#xff0c;前端网页设计已经成为一个备受关注的领域。随着其重要性的不断提高&#xff0c;越来越多的专业人士和爱好者开始对前端设计感兴趣&#xff0c;希望通过掌握这项技术开辟自己的职业道路。然而&#xff0c;对于新手设计师来说&#xff0c;…

Web安全:SQL注入

一、SQL注入三要素 1、用户可以对输入的参数值进行修改。 2、后端不对用户输入的参数值进行严格过滤。 3、用户修改后的参数值可以被带入后端中成功执行&#xff0c;并返回一定结果。 二、SQL注入原理 简单来说&#xff0c;用户输入的值会被插入到SQL语句中&#xff0c;然后…

PHP单商户微店b2c商城微信小程序系统源码

打造专属线上购物空间&#x1f6cd;️ &#x1f680;【开篇&#xff1a;解锁新零售时代新风尚】&#x1f680; 在这个数字化飞速发展的时代&#xff0c;线上购物已成为我们日常生活不可或缺的一部分。对于单商户而言&#xff0c;拥有一个专属的B2C商城微信小程序&#xff0c;…

智驾内卷“全国都能开” 极越纯视觉追求更安全、更舒适

文 | 智能相对论 作者 | 周晚 汽车圈这么和谐的画面真是难得看到。 这几天&#xff0c;理想不依赖高精地图的NOA功能开始全国推送&#xff0c;极越CEO夏一平第一时间发视频送去了祝福。 “恭喜理想无图NOA全国推送&#xff0c;极越汽车愿意和大家一起努力。” 看多了车圈互…