[Linux]多线程

本文介绍了Linux系统中的线程概念,线程与进程的区别,以及多线程在资源管理和调度上的优缺点。详细讲解了线程的创建、退出、等待和分离,并讨论了线程安全,包括互斥锁和条件变量的使用,以及防止死锁的方法。最后,通过顾客厨师问题展示了线程同步的实际应用。
摘要由CSDN通过智能技术生成

线程概念:

线程概念:线程是进程中的一条执行流,负责进程中一段代码的运行调度,一个进程中可以有一个或多个线程。
在Linux下,线程是通过pcb实现的,一个进程中可以有多个pcb,这些pcb共享进程中的大部分资源,因此也被称作轻量级进程。

在这里插入图片描述

线程就是进程中的一条执行流,而在Linux下执行流通过pcb来实现,一个进程中可以有多个执行流pcb,这些pcb共享进程中的大部分资源,相较于传统pcb较为轻量化,因此也被称作轻量级进程。

线程与进程的关键性区别:

​ 进程是系统进行资源分配的基本单元

​ 线程是系统进行运行调度的基本单元

线程间的独有与共享:

​ 独有:标识符、栈、寄存器、信号屏蔽字、errno…

​ 共享:虚拟地址空间、IO信息、信号处理方式、工作路径…

多进程与多线程进行多任务处理的优缺点:

线程优点:

​ 1、线程间通信更加灵活,包含进程间通信在内,还可以使用全局变量以及函数传参实现通信

​ 2、线程的创建与销毁成本更低

​ 3、线程间的调度成本低

进程的优点:稳定,健壮。 应用场景:shell、网络服务器…

线程不是越多越好,cpu资源是固定的,线程给多了反而会增加线程的切换调度成本

cpu密集型程序:程序中进行大量的数据运算,对cpu资源要求高

IO密集型程序:程序中进行大量的IO操作,对cpu资源要求并不高

线程控制

线程控制包括四个方面:创建、退出、等待、分离

创建

操作系统在底层并不会区分轻量级进程与线程,所以操作系统实际上并没有提供用于创建线程的接口,后来的大牛们通过封装实现了线程控制对应所需的库函数,用于对线程操作。

int pthread_creat(pthread_t *tid, pthread_attr_t *attr,
					void*(*routine)(void*), void *arg);
					

pthread_t *tid:(输出型参数) 用于接收线程ID----tid
pthread_attr_t *attr: 设置线程属性----通常置NULL
void*(*routine)(void*): 线程入口函数,入口函数运行完毕后,退出线程
void *arg:传递给线程的数据,就是传递给上面这个入口函数的形参
返回值:
成功返回0;失败返回非0—错误编号。

代码示例:
注意:线程的操作都是通过库函数来实现的,所以在编译和运行相关代码时,需要链接pthread动态库
命令操作:gcc creat.c -o creat -lpthread

#include<pthread.h>
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
void *thr_entry(void* arg){
   
  while(1){
   
    printf("normal thread--%s\n",(void*)arg);
    sleep(1);
  }
  return NULL;
}
int main(){
   
  //pthread_create(tid, 线程属性, 入口函数, 参数 )
  pthread_t tid;
  char *ptr="好好学习~";
  int ret=pthread_create(&tid,NULL,thr_entry,(void*)ptr);
  if(ret!=0){
   
    printf("thread_create error!");
    return -1;
  }
  while(1){
   
    printf("天气真好\n")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值