首页 > 其他分享 >线程的基本概念以及部分函数接口

线程的基本概念以及部分函数接口

时间:2024-06-04 19:56:27浏览次数:9  
标签:attr int void 接口 线程 pthread 进程 基本概念

线程基本概念

线程是进程中的一个执行单元,是CPU调度和分配的最小单元,它允许在同一进程中与其他线程并行运行,并可以共享进程内的资源,如内存、地址空间、打开的文件等。线程的切换非常迅速且开销小,因为它在同一进程中的多个线程之间可以并发执行,甚至允许在一个进程中所有线程都能并发执行;不同进程中的线程也能并发执行,充分利用和发挥了处理机与外围设备并行工作的能力。12

线程与进程相对应,线程与资源分配无关,它属于某一个进程,并与进程内的其他线程一起共享进程的资源。每个进程至少有一个线程存在,即主线程。进程是资源分配的基本单位,而线程是系统调度的最小单位。线程具有许多传统进程所具有的特征,因此也被称为轻型进程(Light-Weight Process),相应地,把传统进程称为重型进程(Heavy-Weight Process)。

LWP:light weight process 轻量级的进程。创建线程的底层函数和进程一样,都是clone,因此线程的本质仍是进程(在linux环境下)

与进程相比,线程有独立的TCB结构体(类似于进程的PCB),但没有独立的地址空间(共享),类似于合租与独居。

查看线程号(LWP,不是TID)可以用下述命令:

ps -lf xxx(pid)

线程创建相关函数

//头文件
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
//=================================属性设置按需要采用,若普通情况可以不用设置===============//
// 定义线程的属性变量
pthread_attr_t attr;                      
 // 初始化属性变量
int pthread_attr_init(pthread_attr_t *attr);   
// 设置属性变量的值
int pthread_attr_setXXX(pthread_attr_t *attr, ...); 

//此处仅列举常用的//
int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate); // 设置/获得线程的分离属性
int pthread_attr_getdetachstate(const pthread_attr_t *attr, int *detachstate);
int pthread_attr_setinheritsched(pthread_attr_t *attr, int inheritsched); // 设置/获得是否继承创建者的调度策略
int pthread_attr_getinheritsched(const pthread_attr_t *attr, int *inheritsched);
int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy); // 设置/获得调度策略
int pthread_attr_getschedpolicy(const pthread_attr_t *attr, int *policy);
int pthread_attr_setschedparam(pthread_attr_t *attr, const struct sched_param *param); // 设置/获得线程的静态优先级
int pthread_attr_getschedparam(const pthread_attr_t *attr, struct sched_param *param);
//=================================上述属性设置按需要采用,若普通情况可以不用设置===============//
 
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg);
// 创建线程,此处void *(*start_routine)(void *)函数指针指向的函数,void *arg作为其参数,并且需要采用值传递,如果数据类型不同需要强转
int pthread_detach(pthread_t thread); // 如果没有设置线程的分离属性,可以用此函数强制设为分离属性,防止线程结束后变为僵尸进程,无法释放资源,而且不能再用 pthread_join等待回收该进程的资源
 
pthread_t pthread_self(void);         // 创建成功后,可以在线程中使用,获取当前线程的tid
void pthread_exit(void *retval);      // 退出线程,并得到返回值retval
int pthread_cancel(pthread_t thread); // 给指定线程发送一个取消的请求
int pthread_setcancelstate(int state, int *oldstate);
// 设置线程的取消状态:PTHREAD_CANCEL_ENABLE 可取消; PTHREAD_CANCEL_DISABLE 不可取消
int pthread_setcanceltype(int type, int *oldtype);
// 设置线程的取消类型:PTHREAD_CANCEL_DEFERRED 延时响应; PTHREAD_CANCEL_ASYNCHRONOUS 立即响应。
 
int pthread_join(pthread_t thread, void **retval); // 接合指定已结束或者待结束的线程,并得到返回状态值;如果指定的线程还在运行,将会阻塞等待。

//避免僵尸进程的方法
1:int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate) 提前设置分离属性
2:int pthread_detach(pthread_t thread);子线程创建后强制设置分离属性
3:在线程结束后利用pthread_join()进行接合。
 

通信方式:

管道通信、 信号通信、共享内存、消息队列、信号量

注意事项

1:在共享进程中申请的内存可以被其他子线程释放

2:在主线程中调用pthread_exit()只会结束主线程,其他子线程不会受到影响,但主线程运用return/exit等语句或子线程调用exit函数都会使整个进程退出

3:线程机制囧两不与信号语义混用。

标签:attr,int,void,接口,线程,pthread,进程,基本概念
From: https://www.cnblogs.com/zeratul/p/18231598

相关文章

  • 【Java基础】线程的概念、特点及创建线程的三种方式
    线程概念程序:是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念。进程:是执行程序的一次执行过程,她是一个动态的概念,是系统资源分配的单位。正在运行的程序在内存中开辟相应的空间。线程:负责程序执行的一条执行路径,是CPU调度和执行的单位。进程和线程......
  • Qt中的多线程与线程池浅析+实例----冒泡排序和快速排序
    转自:https://www.cnblogs.com/wanghongyang/p/14902679.html今天学习了Qt中的多线程和线程池,特写这篇博客来记录一下2|02.多线程2|12.1线程类QThreadQt中提供了一个线程类,通过这个类就可以创建子线程了,Qt中一共提供了两种创建子线程的方式,先看一下这个类中提供的一些常用......
  • 线程池 + 回调 (进程赤用法类似)
    importosimportthreadingimporttimefromconcurrent.futuresimportThreadPoolExecutorfromfunctoolsimportwrapsThreadPool=ThreadPoolExecutor(max_workers=10)defthread_executor(a):print("Iamslave.Iamworking.Iamgoingtosleep3......
  • 接口与数据库
    第一,到数据库确认是哪个环境第二,到Charles抓包拿token把token放在接口文档的Authorize里,刷新或F5去你想工作接口(如订单结束接口)调试,然后去数据库拿id(订单结束id),把id放在orderid,点击发送结束订单 ......
  • 数据结构·基本概念
    DataStructureNotesAuthor:"blueflylabor"Version:1.0RefreshDate2020.11.26Description:JustrecordandreviewsomepointsaboutDataStructure.Havemistakesthatpleasecorrectityourself.数据结构的基本概念1.数据2.数据元素:数据的基本单位,一个......
  • 强化学习(一) 基本概念和赌博机问题
    文章目录什么是强化学习强化学习的两个基本特征强化学习的其它特征强化学习不同于有监督学习强化学习不同于无监督学习强化学习不同于进化方法强化学习的独特挑战强化学习典例强化学习的要素强化学习的适用范围强化学习学术主线解决强化学习问题的一般框架赌博机两个影......
  • Netty线程模型
    在Netty编程模型入门案例中客户端和服务端通信底层如何实现的呢?先看客户端和服务端的类图:两类图大致一样,区别在于ServerBootstrap与EventLoopGroup是组合关系,而Bootstrap与EventLoopGroup之间没有直接的关系。实际在......
  • 揭秘电商数据丨API接口开发:lazada虾皮(Shopee)商品详情数据深度解析
    在电商领域,获取并解析商品详情数据对于市场分析、产品定价、竞争对手分析等方面都至关重要。对于在Lazada和虾皮(Shopee)等电商平台运营的商家或数据分析师来说,能够访问和解析这些平台的商品详情数据将是一个巨大的优势。下面,我们将探讨如何通过API接口开发来深度解析Lazada和虾......
  • 淘宝商品详情API接口::揭秘电商背后商品标题丨价格丨描述图丨sku等
    一、引言在数字化浪潮的推动下,电商行业正以前所未有的速度蓬勃发展。作为中国电商市场的领军企业,淘宝凭借其庞大的商品库和先进的技术支持,为消费者提供了丰富多样的购物选择。而淘宝商品详情API接口,作为连接消费者与商品信息的桥梁,更是为开发者们打开了一扇通往电商世界的大......
  • 京东商品详情API接口:揭秘电商背后商品名称丨价格丨规格丨详情图
    一、引言在电子商务的广阔天地中,京东作为中国领先的电商平台,其背后的技术支撑和数据驱动能力一直备受瞩目。其中,京东商品详情API接口作为连接消费者与商品信息的桥梁,不仅为消费者提供了详尽、准确的商品信息,更为商家提供了强大的数据支持。本文将带您深入探索京东商品详情API......