Linux应用软件编程-多任务处理(线程)

server/2024/12/28 23:26:05/

线程:轻量级的进程,线程的栈区独立(8M),与同一进程中的其他线程共用进程的堆区,数据区,文本区。

进程是操作系统资源分配的最小单位;线程是cpu任务调度的最小单位。

1. 线程的创建:线程由所属的进程创建,进程为其分配独立的栈区空间,堆区,数据区,文本区与其他线程和所在进程共享。

2. 线程调度:宏观并行, 微观串行。

3. 线程的消亡:(1)线程退出,(2) 回收线程资源

进程与线程的区别:

正在执行的程序 ; 轻量级进程。线程一定属于进程。与同一进程中的其他线程共用进程的堆区,数据区,文本区

进程是操作系统资源分配的最小单位;                    线程是cpu任务调度的最小单位。

资源消耗:进程消耗的资源空间大                           线程:消耗的资源空间小,只需分配栈区空间

效率角度:创建线程比创建进程效率高,任务切换跨进程效率低于跨线程

安全角度:由于进程空间独立,所以安全性比线程高。

通信角度:进程间不能直接通信,需要使用进程间通信方式(IPC)实现;线程可以直接通信,比如:全局变量

创建线程

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

    功能:创建一个线程

    参数:

         thread: 保存线程ID的变量地址

         attr:线程属性  默认属性:NULL

         void *(*start_routine) (void *) : 线程任务处理函数

         arg:传递给任务处理函数的参数

返回值:成功:0;失败:非0

pthread_self():获取当前线程的id号

线程间通信:1). 全局变量;2). pthread_create传参的方式

2. 线程退出及资源回收
   (1)退出:
        1)在线程任务中调用return;

        2)在线程任务pthread_exit

    (2)回收:

         int pthread_join(pthread_t thread, void **retval);

         功能:阻塞回收线程的资源, 状态

       参数:

                 thread:需要回收的线程ID

                 retval:保存线程退出时的状态,比如return 返回的内容地址
       返回值:成功:0

这里插一下在此能被返回的指针类型:

线程非分离属性:能被pthread_join回收或者能被其他线程结束的线程,称为具有非分离属性的线程

线程分离属性:不需要回收,或者执行结束会被系统回收的线程,称为分离属性的线程

直接设置分离属性使用:pthread_detach(pthread_t tid);

也可以这么设置:

1. 定义一个线程属性对象:pthread_attr_t

2. 初始化线程属性对象:pthread_attr_init();

3. 设置线程的分离属性:pthread_attr_setdetachstate();

4. 以分离属性创建线程:pthread_create();

5. 销毁属性对象:pthread_attr_destroy();


http://www.ppmy.cn/server/154046.html

相关文章

【网络安全】John the Ripper 散列密码,PDF密码

John the Ripper 1. John the Ripper 散列密码 假设我们已经获取到一个数据泄露中包含的散列密码文件 hash1.txt,并需要还原原始密码。步骤如下: 识别散列类型 通过 hash-id.py 工具,我们确认 hash1.txt 的散列类型是 SHA-256。 usermach…

DALL-M:基于大语言模型的上下文感知临床数据增强方法 ,补充

DALL-M:基于大语言模型的上下文感知临床数据增强方法 ,补充 论文大纲理解结构分析数据分析1. 数据收集2. 数据处理和规律挖掘3. 相关性分析4. 数学模型建立解法拆解1. 逻辑关系拆解 子解法拆解: 2. 逻辑链分析3. 隐性方法分析4. 隐性特征分析…

Go的select的运行原理

Go语言中的select语句是一种专门用于处理多个通道(channel)操作的控制结构。其运行原理可以概括为以下几点: 1. 监听多个通道 select语句能够同时监听多个通道上的操作,这些操作可以是发送操作或接收操作。每个通道操作都对应se…

使用idea创建JDK8的SpringBoot项目

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 使用idea创建JDK8的SpringBoot项目 前言我们经常在创建新的springboot项目,默认使用的是spring.io进行创建,但是它总是只会提供高版本的创建方式&…

salesforce 控制 Experience Cloud 站点用户可以看到哪些用户

在 Salesforce 的 Experience Cloud 中,您可以通过多种方式控制站点用户(如社区用户)之间的可见性。这包括用户之间的信息可见性以及他们可以访问的其他用户数据。以下是几种方法和设置,用于实现对 Experience Cloud 站点用户可见…

ONNX 转 TensorRT Bug 记录:IIfConditionalOutputLayer

1. 问题描述 环境:TensorRT-8.6.1.6、CUDA-11.8 报错:Error[4]: /If_OutputLayer: IIfConditionalOutputLayer inputs must have the same shape. Shapes are [-1,384] and [-1,1,384]. 复现代码: import os import torch import torch.n…

私域电商逆袭密码:AI 智能名片小程序与商城系统如何梦幻联动

摘要:在当今数字化电商蓬勃发展的浪潮下,AI 智能名片小程序与商城系统的整合成为推动电商业务进阶的关键着力点。本文聚焦于入口融合、数据共享以及联合推广三大核心整合策略,结合时尚、运动等多领域实例,深入剖析二者整合如何优化…

Mono里运行C#脚本3—mono_jit_init

前面已经介绍了配置参数的读取,这样就可以把一些特殊的配置读取进来,完成了用户配置阶段的参数,接着下来就需要进行大工程的建造了。 为什么这样说呢,因为需要解释并执行C#编译的受托管的代码,相当于就是建立一个C#代码运行的虚拟机,而这个虚拟机还是很复杂的,不但要支…