前言:线程的有关代码实现其实都是库函数,也就是说操作系统并没有提供创建线程的接口,库函数封装了一套线程库,用于提供线程的各种操作

创建线程

接口int pthread_create(pthread_t *thread, const pthread_attr_t *arrt, void *(*start_routine)(void *), void *arg)
参数内容(thread 输出型参数,用于获取线程id,也就是线程的操作句柄;attr 线程属性,用于创建线程的同时设置线程属性,通常置为NULL;start_routine是函数指针,是一个线程的入口函数,线程运行的就是这个函数,函数运行完毕,则线程就会退出;arg通过线程入口函数,传递给线程的参数)
返回值:成功返回0;失败返回一个非0值,也就是一个错误编号

//create.c
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <pthread.h>//全局变量
int a = 100;//线程入口函数
void *thr_start(void* arg)
{strcpy(arg, "主线程的变量被我修改了~");while (1){a = 200;//将全局变量进行修改printf("I am common thread~~%s----%d\n", (char*)arg, a);sleep(1);}return NULL;
}int main()
{//创建线程pthread_t tid;char ptr[] = "hahahaha~";//创建线程int ret = pthread_create(&tid, NULL, thr_start, (void*)ptr);if (ret != 0){printf("create thread failed!\n");return -1;}printf("create thread success!\n");while (1){printf("i am main thread--%s--%d\n",ptr, a);sleep(1);}return 0;
}

当我们运行一个程序时,都会有一个主线程,而这个主线程就是在main函数中的一条执行流,我们可以通过主线程创建普通线程,让它去执行一个函数,完成指定的功能,线程由于都占用同一个虚拟地址空间,共享大部分资源,虚拟地址通过页表映射都是一样的,所以只要可以拿到一个变量的地址,再通过虚拟地址修改物理地址上的内容,当其他线程也使用这个变量时,也是会一样映射到同一块物理内存,这个修改会影响到所有的线程。代码中的两个线程同时执行,当普通线程对全局变量a进行内容修改,主线程使用a是,也是被修改过后的内容了。再看主线程中的内容ptr,通过地址传给普通线程,普通线程也对该变量进行内容修改,主线程使用时,也是使用被修改过的内容

什么是tid呢?
tid的类型是一个无符号长整形数据,tid是一个线程id,也就是线程的操作句柄,准确来说这个tid是用户态线程的id,在空间中这个id是一块空间的首地址。每个线程被创建出来之后,都会开辟一块空间,存储自己的栈和自己的描述信息

task_struct-> pid:轻量级进程id,也就是ps -efL看到的LWP
task_struct->tgid:线程组id,等于主线程id,也就是ps -ef看到的进程id)

线程终止

return

线程入口函数运行完毕,线程就会自动退出,在线程入口函数中调用return。(main函数调用return是退出进程)

在主线程中调用return 主线程return退出,全部线程都退出

在普通线程中调用return 普通线程退出不影响其他线程的执行

pthread_exit()

接口pthread_exit(void *retval)退出线程的接口,谁调用谁退出,retval是退出返回值

在主线程中调用pthread_exit 主线程退出,并不会使进程退出,只有所有线程退出,进程才会退出

在普通线程中调用pthread_exit

pthread_cancel()

接口int pthread_cancel(pthread_t thread) 终止一个指定的线程,退出的线程是被动取消的。

线程等待

线程等待就是等待一个进程的退出,获取退出线程的返回值,回收线程所占的资源

每个线程都有一个属性,默认创建出来的这个属性是joinnable,退出后,需要被其他线程等待获取返回值并回收资源

pthread_join()

接口int pthread_join(pthread_t thread, void **retval) 等待指定的线程退出,获取其返回值,这是一个阻塞函数,线程没有退出则一直等待
参数内容(thread:要等待退出的线程id;retval:输出型参数,用于返回线程的返回值)

特别要注意的是,返回值必须是字符串指针,不能是字符串数组,字符串数组是在栈区的,当一个线程退出,这个字符串数字也就会被系统收回,此时另一个线程等到返回值时就是收到一块已经释放了的空间的内容

我们知道线程等待是一个会是线程发生阻塞的操作,但是如果我们不进行等待,就会造成资源的泄漏,那我们有没有办法既等待线程,又不阻塞呢?答案是可以的,这时候就要引入线程分离

线程分离

线程分离:将线程joinable属性修改为detach属性
一个线程的属性若是joinable那么就必须被等待,若是这个属性是detach,那么这个线程退出后则自动释放资源,不需要被等待(也不能被等待)
使用场景:对获取一个线程退出的返回值没有意义,且不想等待线程退出
接口int pthread_detach(pthread_t thread),将指定的线程分离出去----将属性修改为detach

线程分离并非需要其他线程来设定,每个线程都可以将自己进行线程分离,也就是在函数中调用pthread_detach()函数,但是我们如何获取自己线程的tid呢?库函数中有一个接口pthread_t pthread_selt(void) 返回调用线程的pid

Linux 线程控制相关推荐

  1. 【Linux系统编程学习】Linux线程控制原语

    此为牛客Linux C++课程笔记. 0. 关于线程 注意:LWP号和线程id不同, LWP号是CPU分配时间片的依据,线程id是用于在进程内部区分线程的. 1. 线程与进程的区别 对于进程来说,相同 ...

  2. Linux系统编程之进程与线程控制原语对比

    Linux系统编程之进程与线程控制原语对比 进程 线程 fork pthread_create exit pthread_exit wait pthread_join kill pthread_can ...

  3. Linux 多线程(一)线程概念:线程概念、线程与进程、线程间的独有与共享、多线程与多进程、线程控制

    线程概念 线程与进程 线程间的独有与共享 多线程与多进程 线程控制 线程概念 什么是线程 线程是进程中的一条执行流,执行程序中的某部分代码.linux下没有具体实现的线程,只有库函数用pcb来实现的线 ...

  4. Linux系统编程36:多线程之线程控制之pthread线程库(线程创建,终止,等待和分离)

    文章目录 (1)POSIX线程库 (2)pthread_create--创建线程 A:关于Linux线程的再理解 B:线程ID及地址空间布局 (3)pthread_exit--线程终止 (4)pthr ...

  5. linux多线程学习(五)——信号量线程控制

    在上一篇文章中,讲述了线程中互斥锁的使用,达到对共享资源互斥使用.除了使用互斥锁,信号量,也就是操作系统中所提到的PV原语,能达到互斥和同步的效果,这就是今天我们所要讲述的信号量线程控制. PV原语是 ...

  6. [Linux]线程概念_线程控制(线程与进程的区别与联系 | 线程创建 | 线程等待 | 线程终止 | 线程分离 | LWP)

    文章目录 线程概念 进程和线程的关系 线程的优点 线程的缺点 线程控制 Linux线程和接口关系的认识 线程创建 线程ID及进程地址空间布局 线程等待 线程终止 线程终止状态 线程分离 LWP和pth ...

  7. Linux多线程---线程概念和线程控制

    线程概念 什么是线程? CPU视角: 与进程的关系: Linux下线程概念 那么CPU能分辨task_struct是进程和线程吗? 理解页表 为何以多级页表实现? 多级页表是如何实现的? 多级页表的优 ...

  8. 【Linux】线程概念与线程控制

    认识线程 线程是一个执行流(运行代码,处理数据) ​ 1.操作系统使用pcb来描述一个程序的运行-------pcb就是进程 ​ 2.linux下通过pcb模拟实现线程,因此linux下的线程是一个轻 ...

  9. Linux下的C编程实战(开发平台搭建,文件系统编程,进程控制与进程通信编程,“线程”控制与“线程”通信编程,驱动程序设计,专家问答)

    Linux下的C编程实战(一) ――开发平台搭建 1.引言 Linux操作系统在服务器领域的应用和普及已经有较长的历史,这源于它的开源特点以及其超越Windows的安全性和稳定性.而近年来,Linux ...

最新文章

  1. Mako 模板系统文档翻译(1) 使用基础
  2. python判断是否为类的实例,是否为子类
  3. [ Android 五种数据存储方式之二 ] —— 文件存储数据
  4. PAT甲级题目翻译+答案 AcWing(字符串处理)
  5. HDU 5115 Dire Wolf
  6. Test Article
  7. mysql8.0.19.0_分享MySql8.0.19 安装采坑记录
  8. 再度吐槽,PHP在centos7的安装方式稍不注意可能就打击你的积极性
  9. Mysql报错Fatal error occurred in the transaction branch - check your data for consistency
  10. 标注工具——Electron、HTML、CSSjs的学习笔记目录
  11. 宇宙最强下载器:IDM 俄罗斯大神版
  12. 【CodeVS3372】选学霸
  13. 国电集团:电子招投标每年节约成本10亿元
  14. 我们是如何优化英雄联盟的代码的
  15. 三极管放大电路原理-电子技术方案
  16. [论文笔记]Fader Networks: Manipulating Images by Sliding Attributes(2017 NIPS)
  17. 3.1 机器学习 --- 决策树
  18. flutter全屏背景图(包括appbar和状态栏)以及沉浸状态栏的设置
  19. Origin科研绘图20211129:双y轴能量曲线及loess光滑处理
  20. matlab量化矩阵,MATLAB量化金融分析基础与实战/MATLAB工程应用书库

热门文章

  1. python窗体处理access数据库_用Python操作MS Access数据库
  2. wpf 修改label值_c# – 在WPF中绑定Setter属性的值
  3. oracle数据库通过SQL profile 绑定SQL最优执行计划(个人实践)
  4. Git 分支相关操作
  5. 使用spring 配置数据源,并用数据源得到连接,操作sql
  6. 基于JAVA+SpringMVC+MYSQL的进销存ERP系统
  7. 基于JAVA+SpringMVC+Mybatis+MYSQL的宠物商城
  8. 基于JAVA+Servlet+JSP+MYSQL的员工管理系统
  9. 3-ESP8266 SDK开发基础入门篇--点亮一个灯
  10. 简易OA漫谈之工作流设计(五,直接上级)