Linux操作系统软件编程——多线程

什么是线程

线程的定义

        是轻量级的进程,可以实现多任务的并发。线程是操作系统任务调度的最小单位

线程的创建

        由某个进程创建,且进程创建线程时,会为其分配独立的栈区空间(默认8M)。线程和所在的进程,以及进程中的其他线程,共用进程的堆区、文本区、数据区

线程的调度

        宏观并行,微观串行

进程和线程的区别

进程线程
单位操作系统资源分配的最小单位操作系统任务调度的最小单位
资源消耗资源消耗开销大,每次创建都需要有0-4G的虚拟内存空间资源消耗开销较小,只需要由所在进程为其开辟默认8M的栈区空间
效率由操作系统创建,创建耗时大,跨进程调度慢由进程创建,创建耗时小,跨线程调度快
通信进程间不能直接通信,需要使用进程间通信机制(IPC)通信简单,可以使用线程共享的区域通信(例如全局变量)
安全性安全性较高,因为各个进程空间独立安全性较低,一个线程异常,可能影响同一进程中的线程

线程相关编程

        线程的创建:pthread_read();pthread_self():获取当前线程的ID号

        线程的调度:由操作系统调度

        线程的凋亡:

                1,线程退出:在线程任务函数中使用return结束线程或者调用pthread_exit()结束线程

                2,线程回收:pthread_join(tid,NULL)

pthread_create()

        功能:创建一个新的线程

        参数:

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

                attr:线程属性的对象地址,如果是NULL则按照默认属性创建

                void *(*start_routine)(void *):函数指针,指向线程启动后要执行的任务

                                指针名称:start_routine

                                指向的对象:函数void *()(void *)

                arg:为线程任务函数传递的参数,如果不传参则传NULL

        返回值:成功则为0,失败则为!0

        需要注意的是,在使用这个函数时,需要在创建或者编译时加上后缀,如图所示

        当进程中创建了线程,不要直接退出进程(线程之后就接return),在return之前设立一个死循环或者sleep,否则可能线程还未执行,进程就优先结束,连带着线程也结束

pthread_exit()

        功能:退出一个线程任务

        参数:向回收的线程传递的参数的地址,如果不传递参数则为NULL

        pthread_exit(NULL)等价于return NULL

pthread_join()

        功能:阻塞等待回收线程资源空间

        参数:要回收的线程ID;用来保存线程退出时传递的参数,NULL表示不接收传递的参数

        返回值:成功为0,失败为-1

线程属性

        1,分离属性:不需要被其他线程回收的线程,将来会被操作系统回收

        2,非分离属性:可以被其他线程回收或者结束的线程,默认属性为非分离属性

线程回收策略

        1,分离属性的线程:不需要回收(没有空闲的线程可以帮忙回收)

        2,调用pthread_join阻塞回收

int pthread_detach(pthread_t thread)

        功能:将线程设置成分离属性的线程

线程间通信

        临界资源:多个线程可以同时访问的资源,例如全局变量,共享内存区域

        然而,在多个线程在访问临界资源时,会存在资源竞争问题,如下

        如果按照代码正常思路,最后输出应该是200000,但是最后却输出199997,这是由于对于全局变量n,其中一个线程调用并进行操作,还未将结果重新赋予时,另一个线程也进行了调用,导致两个线程赋予了同一个值。

        事实上,数字越大越容易出现这种情况,但是并不代表每次运行都会出现这种情况,所以为了完全避免这种资源竞争问题,需要用到互斥机制

互斥机制

        互斥机制:多个线程访问临界资源时,具有排他性访问的机制,即一次只允许一个线程对该临界资源进行访问

        实现互斥机制的步骤

                1,创建互斥锁:pthread_mutex_t

                2,初始化互斥锁:pthread_mutex_init

                3,锁上:int pthread_mutex_lock(pthread_mutex_t *mutex)

                4,解锁:int pthread_mutex_unlock(pthread_mutex_t *mutex)

                5,销毁锁:int pthread_mutex_destroy(pthread_mutex_t *mutex)

pthread_mutex_init

        功能:初始化互斥锁

        参数:锁住对象的地址;锁的属性,如果是NULL则为默认属性

        返回值:成功则为0,失败则为-1

        所以上述的例子可改为

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

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

相关文章

linux下找到指定目录下最新日期log文件

以下是一个完整的C函数&#xff0c;用于在指定目录下自动查找最近更新的日志文件&#xff08;根据文件名中的时间戳选择最新的文件&#xff09;&#xff1a;#include <stdio.h> #include <stdlib.h> #include <string.h> #include <dirent.h> #include…

《数学模型》经典案例——钢管的订购与运输

一、问题描述 要铺设一条 A1→A2→⋯→A15A_1 \rightarrow A_2 \rightarrow \cdots \rightarrow A_{15}A1​→A2​→⋯→A15​ 的输送天然气的主管道&#xff0c;如图 6.22 所示。经筛选后可以生产这种主管道钢管的钢厂有 S1,S2,⋯,S7S_1, S_2, \cdots, S_7S1​,S2​,⋯,S7​ 。…

Java Web部署

今天小编来分享下如何将本地写的Java Web程序部署到Linux上。 小编介绍两种方式&#xff1a; 部署基于Linux Systemd服务、基于Docker容器化部署 首先部署基于Linux Systemd服务 那么部署之前&#xff0c;要对下载所需的环境 软件下载 Linux&#xff08;以ubuntu&#xf…

告别AI“炼丹术”:“策略悬崖”理论如何为大模型对齐指明科学路径

摘要&#xff1a;当前&#xff0c;我们训练大模型的方式&#xff0c;尤其是RLHF&#xff0c;充满了不确定性&#xff0c;时常产生“谄媚”、“欺骗”等怪异行为&#xff0c;被戏称为“炼丹”。一篇来自上海AI Lab的重磅论文提出的“策略悬崖”理论&#xff0c;首次为这个混沌的…

深入理解C#特性:从应用到自定义

——解锁元数据标记的高级玩法&#x1f4a1; 核心认知&#xff1a;特性本质揭秘 public sealed class ReviewCommentAttribute : System.Attribute { ... }特性即特殊类&#xff1a;所有自定义特性必须继承 System.Attribute&#xff08;基础规则&#xff09;命名规范&#xff…

机器学习-集成学习(EnsembleLearning)

0 结果展示 0.1 鸢尾花分类 import pandas as pd import numpy as npfrom sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score, recall_score, f1_score, classification_repo…

Golang database/sql 包深度解析(一)

database/sql 是 Go 语言标准库中用于与 SQL&#xff08;或类 SQL&#xff09;数据库交互的核心包&#xff0c;提供了一套轻量级、通用的接口&#xff0c;使得开发者可以用统一的方式操作各种不同的数据库&#xff0c;而无需关心底层数据库驱动的具体实现。 核心设计理念 datab…

文章自然润色 API 数据接口

文章自然润色 API 数据接口 ai / 文本处理 基于 AI 的文章润色 专有模型 / 智能纠错。 1. 产品功能 基于自有专业模型进行 AI 智能润色对原始内容进行智能纠错高效的文本润色性能全接口支持 HTTPS&#xff08;TLS v1.0 / v1.1 / v1.2 / v1.3&#xff09;&#xff1b;全面兼容…

【状压DP】3276. 选择矩阵中单元格的最大得分|2403

本文涉及知识点 C动态规划 3276. 选择矩阵中单元格的最大得分 给你一个由正整数构成的二维矩阵 grid。 你需要从矩阵中选择 一个或多个 单元格&#xff0c;选中的单元格应满足以下条件&#xff1a; 所选单元格中的任意两个单元格都不会处于矩阵的 同一行。 所选单元格的值 互…

IDEA 清除 ctrl+shift+r 全局搜索记录

定位文件&#xff1a;在Windows系统中&#xff0c;文件通常位于C:Users/用户名/AppData/Roaming/JetBrains/IntelliJIdea(idea版本)/workspace目录下&#xff0c;文件名为一小串随机字符&#xff1b;在Mac系统中&#xff0c;文件位于/Users/用户名/Library/Application /Suppor…

解锁AI大模型:Prompt工程全面解析

解锁AI大模型&#xff1a;Prompt工程全面解析 本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型开发 学习视频/籽料/面试题 都在这>>Github<< 从新手到高手&#xff0c;Prompt 工程究竟是什么&#xff1f; 在当今数字化时代&#xff0c;AI …

HTTP0.9/1.0/1.1/2.0

在HTTP0.9中&#xff0c;只有GET方法&#xff0c;没有请求头headers&#xff0c;没有状态码&#xff0c;只能用于传输HTML文件。到了HTTP1.0(1996)&#xff0c;HTTP1.0传输请求头&#xff0c;有状态码&#xff0c;并且新增了POST和HEAD方法。HTTP1.0中&#xff0c;使用短连接&a…

gitee 流水线+docker-compose部署 nodejs服务+mysql+redis

文章中的方法是自己琢磨出来的&#xff0c;或许有更优解&#xff0c;共同学习&#xff0c;共同进步&#xff01; docker-compose.yml 文件配置&#xff1a; 说明&#xff1a;【配置中有个别字段冗余&#xff0c;但不影响使用】该文件推荐放在nodejs项目的根目录中&#xff0c…

【算法】模拟专题

什么是模拟&#xff1f; 是一种通过模仿现实世界或问题场景的运行过程来求解问题的算法思想。它不依赖复杂的数学推导或逻辑优化&#xff0c;而是按照问题的实际规则、步骤或流程&#xff0c;一步步地 “复现” 过程&#xff0c;最终得到结果。 使用场景&#xff1a;当问题的逻…

【FreeRTOS】刨根问底6: 应该如何防止任务栈溢出?

【加关注&#xff0c;不迷路】一、栈溢出&#xff1a;程序世界的“越界洪水”就象一个装水的玻璃杯&#xff08;栈空间&#xff09;&#xff0c;每次调用函数就像向水杯中倒水&#xff08;压入保护需要恢复的数据&#xff09;。当函数嵌套调用过深&#xff08;如递归失控&#…

牛客周赛 Round 105

A.小苯的xor构造题目描述小红喜欢整数 k&#xff0c;他想让小苯构造两个不相等的非负整数&#xff0c;使得两数的异或和等于 k。请你帮帮小苯。#include <bits/stdc.h> using namespace std; using ll long long; void solve() {int k;cin>>k;cout<<0<&l…

《R for Data Science (2e)》免费中文翻译 (第4章) --- Workflow: code style

写在前面 本系列推文为《R for Data Science (2)》的中文翻译版本。所有内容都通过开源免费的方式上传至Github&#xff0c;欢迎大家参与贡献&#xff0c;详细信息见&#xff1a; Books-zh-cn 项目介绍&#xff1a; Books-zh-cn&#xff1a;开源免费的中文书籍社区 r4ds-zh-cn …

11-verilog的RTC驱动代码

verilog的RTC驱动代码 1.例化parameter SLAVE_ADDR 7h51 ; // 器件地址 parameter BIT_CTRL 1b0 ; // 字地址位控制参数(16b/8b) parameter CLK_FREQ 26d50_000_000; // i2c_dri模块的驱动时钟频率(CLK_FREQ) parameter I2C_FR…

【k8s、docker】Headless Service(无头服务)

文章目录问题背景1、什么是Headless Service1.2 为什么 Zookeeper 使用 Headless Service&#xff1f;1.2 Headless Service 的 DNS 行为1.3 验证示例1.4 如何创建 Headless Service&#xff1f;2. zk-0.zookeeper.default.svc.cluster.local 域名是如何创建出来的&#xff1f;…

scikit-learn/sklearn学习|套索回归Lasso解读

【1】引言 前序学习进程中&#xff0c;对用scikit-learn表达线性回归进行了初步解读。 线性回归能够将因变量yyy表达成由自变量xxx、线性系数矩阵www和截距bbb组成的线性函数式&#xff1a; y∑i1nwi⋅xibwTxby\sum_{i1}^{n}w_{i}\cdot x_{i}bw^T{x}byi1∑n​wi​⋅xi​bwTxb实…