公共资源

也称为共享资源,是指可以被多个并发进程或线程共同访问(读取或写入)的系统资源。

临界资源

是公共资源的一个子集。特指那些一次仅允许一个进程或线程访问的公共资源。如果一个进程正在使用它,其他试图访问该资源的进程必须等待,直到当前访问完成。

临界区

指进程中访问临界资源的那段代码。它不是资源本身,而是操作资源的代码段。 目标:确保当一个进程在临界区内执行时,其他任何进程都不能进入其自身的临界区(访问同一个临界资源)。

互斥

是一种机制、原则或属性,用于保证对临界资源的互斥访问。它要求在任何时刻,最多只能有一个执行流(进程或线程)进入与某一临界资源相关的临界区。

互斥量

作用:用于线程的互斥,以避免对临界资源访问时冲突问题。

用法:通常在进入临界区之前加锁,退出临界区时解锁。

类型:pthread_mutex_t定义变量:pthread_mutex_t mutex;
操作:初始化(两种方法)1. pthread_mutex_init(&mutex, NULL);//此方法需要销毁2. pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;//此方法不需要销毁加锁: pthread_mutex_lock(&mutex);已经被加锁,线程阻塞。pthread_mutex_trylock(&mutex);已经被加锁,线程不阻塞,通过返回值判断所得状态。解锁:pthread_mutex_unlock(&mutex);销毁: pthread_mutex_destroy(&mutex);

死锁

什么是死锁:

多进程或多线程,在竞争资源的时候,由于互相抢占而导致僵死的状态叫做死锁。

死锁是由于一方拿到资源不释放。而其他线程或进程无法获取资源导致。

解决死锁的方法:

  1. 使用非阻塞方式拿锁,不等待。

    • 拿到做做事,拿不到锁做其他的事。
  2. 获取多个互斥量时规定拿锁的顺序。

    • 如有A、B两个锁,规定先拿A再拿B,拿不到A就不允许拿B。
  3. 互斥量允许强制剥夺。

    • 如果有线程占用互斥量时间过长,允许其他线程强制剥夺互斥量。

示例代码

#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>#include <pthread.h>#define MAX_THREADS (5)  // 最大的线程个数static int is_running = 1;
// 针对 is_running 这个资源的锁
static pthread_mutex_t running_lock;// 临界资源i
static long int i = 0;
// 针对 i 这个资源的锁,并初始化
static pthread_mutex_t count_lock = PTHREAD_MUTEX_INITIALIZER;
// 定义一个线程处理函数
void * mythread(void* data) {long int arg = (long int)data;char charactor = 'a' + arg;while(1) {int run;pthread_mutex_lock(&running_lock);run = is_running;pthread_mutex_unlock(&running_lock);if (!run)break;// 对i 这个临界资源加锁pthread_mutex_lock(&count_lock);if (i == arg) {printf("%c", charactor);fflush(stdout);i = (i + 1) % MAX_THREADS;}// 解锁pthread_mutex_unlock(&count_lock);}return data;
}int main(int argc, char * argv[]) {pthread_t thread[MAX_THREADS];int ret;printf("请输入回车开始和结束线程\n");getchar();// 初始化运行状态锁pthread_mutex_init(&running_lock, NULL);for (long int i = 0; i < MAX_THREADS; i++) {void *varg = (void*)i;ret = pthread_create(&thread[i], NULL, mythread, varg);if (ret) {printf("pthread_create error: %d\n", ret);return 1;}}// 等待回车getchar();pthread_mutex_lock(&running_lock);is_running = 0;pthread_mutex_unlock(&running_lock);// 杀死所有的线程// for (int i = 0; i < MAX_THREADS; i++) {//     pthread_cancel(thread[i]);// } // 等待回收资源for (int i = 0; i < MAX_THREADS; i++) {void * pret;pthread_join(thread[i], &pret);printf("pret:%p\n", pret);} // 销毁运行状态锁pthread_mutex_destroy(&running_lock);printf("主进程结束\n");return 0;
}

条件变量:

条件变量是一种线程同步机制,他允许一个线程在某个条件不满足时主动进入等待状态并释放锁,直到另一个线程改变这个条件后再通知其他线程继续运行。

核心思想:以查。


定义条件变量:pthread_cond_t mycond;
操作:初始化(两种方法)1. pthread_cond_init(&mycond, NULL);//此方法需要销毁2. pthread_cond_t mycond = PTHREAD_COND_INITIALIZER;//此方法不需要销毁等待条件: pthread_cond_wait(&mycond, &mutex);唤醒等待的线程:pthread_cond_signal(&mycond); // 唤醒一个线程pthread_cond_broadcast(&mycond);  // 广播唤醒全部线程。销毁: pthread_cond_destroy(&mycond);

示例代码:

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>#include <pthread.h>#define MAX_THREADS (5)  // 最大的线程个数static int is_running = 1;
// 针对 is_running 这个资源的锁
static pthread_mutex_t running_lock;// 临界资源i
static long int i = 0;
// 针对 i 这个资源的锁,并初始化
static pthread_mutex_t count_lock = PTHREAD_MUTEX_INITIALIZER;
// 定义 i 这个资源的条件变量,并初始化
static pthread_cond_t count_cond = PTHREAD_COND_INITIALIZER;// 定义一个线程处理函数
void * mythread(void* data) {long int arg = (long int)data;char charactor = 'a' + arg;while(1) {int run;// pthread_mutex_lock(&running_lock);run = is_running;// pthread_mutex_unlock(&running_lock);if (!run)break;// 对i 这个临界资源加锁pthread_mutex_lock(&count_lock);while( i != arg && is_running != 0) {pthread_cond_wait(&count_cond, &count_lock);}if (i == arg) {printf("%c", charactor);fflush(stdout);i = (i + 1) % MAX_THREADS;// 唤醒条件变量关联的其他线程。// pthread_cond_signal(&count_cond); //唤醒一个线程pthread_cond_broadcast(&count_cond); //唤醒全部}/* else {// 现在不应当我来打印。解锁睡觉等待条件变化pthread_cond_wait(&count_cond, &count_lock);// 如果返回,说明条件变化,立即加锁做事情}*/// 解锁pthread_mutex_unlock(&count_lock);}return data;
}int main(int argc, char * argv[]) {pthread_t thread[MAX_THREADS];int ret;printf("请输入回车开始和结束线程\n");getchar();// 初始化运行状态锁pthread_mutex_init(&running_lock, NULL);for (long int i = 0; i < MAX_THREADS; i++) {void *varg = (void*)i;ret = pthread_create(&thread[i], NULL, mythread, varg);if (ret) {printf("pthread_create error: %d\n", ret);return 1;}}// 等待回车getchar();pthread_mutex_lock(&running_lock);is_running = 0;pthread_mutex_unlock(&running_lock);// 再次唤醒所有的进程退出。pthread_cond_broadcast(&count_cond); //唤醒全部// 杀死所有的线程// for (int i = 0; i < MAX_THREADS; i++) {//     pthread_cancel(thread[i]);// } // 等待回收资源for (int i = 0; i < MAX_THREADS; i++) {void * pret;pthread_join(thread[i], &pret);printf("pret:%p\n", pret);} // 销毁运行状态锁pthread_mutex_destroy(&running_lock);printf("主进程结束\n");return 0;
}

网络IPC

IP 地址(Internet Protocal Address):

IP 地址是记录一个网络设备的逻辑地址。

IP地址的分类:

  • IPv4: 用 32bit 来标识网络设备(四个字节)

    • 192.168.1.100
  • IPv6:用 128bit 来标识网络设备

    • 不稳定,是未来的发展趋势。

端口号(port):

用来记录网路设备上特定进程的关联号码。是一个16位的无符号性整数。

值 1~65535

IP 地址和子网掩码

A类:255.0.0.0

B类:255.255.0.0

C类:255.255.255.0

查看IP地址的命令:

# Windows 
ipconfig
# 早期 Linux/UNIX
ifconfig
# Ubuntu Linux 
ip a
ip addr
ip address

内容如下:

inet 192.168.33.151/24 brd 192.168.33.255 scope global dynamic noprefixroute ens33# IP 地址: 192.168.33.151
# 广播地址:192.168.33.255
# 子网掩码: /24 表示 (255.255.255.0)IP 地址 & 子网掩码 = 192.168.33.151 & 255.255.255.0 = 192.168.33.0 本网路的地址

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

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

相关文章

spring-kafka消费异常处理

默认的消费异常处理 默认情况下&#xff0c;如果程序没有显式做任何的异常处理&#xff0c;spring-kafka会提供一个默认的DefaultErrorHandler, 它会使用FixedBackOff做重试&#xff0c;会不间断的连续重试最多9次&#xff0c;也就是说一个消息最多会被消费10次。如果重试次数耗…

leecode73 矩阵置零

我的思路 这个题目不难&#xff0c;就是一句话&#xff0c;遍历这个矩阵的时候&#xff0c;当遇到0的时候就把该行该列改为0&#xff0c;同时为了不影响后续的遍历&#xff0c;我们可以将这个遍历和修改分为两个数组。使用mn的辅助空间 class Solution {public void setZeroe…

Spring Boot 与前端文件上传跨域问题:Multipart、CORS 与网关配置

前言在前后端分离架构下&#xff0c;文件上传是一个常见功能。但在 Spring Boot 项目中&#xff0c;我们经常会遇到前端调用接口上传文件时出现 跨域问题&#xff0c;表现为&#xff1a;浏览器控制台报错&#xff1a;Access-Control-Allow-Origin 缺失或不匹配。使用 FormData …

快速解决云服务器的数据库PhpMyAdmin登录问题

打开PhpMyAdmin数据库管理器登录页面账号密码就是你的用户名&#xff08;如YiXun&#xff09;和密码注意&#xff1a;root账户的密码&#xff0c;点击下面的“root密码”即能看到或修改PhpMyAdmin无法打开如果打不开&#xff1a;在数据库&#xff0c;点击PHPMyAdmin&#xff0c…

vite+vue3中使用FFmpeg@0.12.15实现视频编辑功能,不依赖SharedArrayBuffer!!!

FFmpeg0.12.15完全不依赖SharedArrayBuffer!!!强烈推荐使用 本文章主要是在vitevue3项目中使用FFmpeg&#xff0c;只展示了如何在项目中引入和基础的使用 更多详细参数可参照 ffmpeg官网https://ffmpeg.org/ 一、安装FFmpeg 可通过npm直接安装 npm install ffmpeg/core0.12.10…

构网型5MW中压储能变流升压一体机技术方案

1 构网型储能背景概述1.1 新型电力系统亟需构网支撑众所周知&#xff0c;新型电力系统具有两高特征&#xff1a;高比例新能源大规模并网、高比例电力电子大范围接入。近年来风光装机占比越来越高&#xff0c;而传统火电装机占比越来越低&#xff0c;并在2023年首次降至50%以下…

SRE 系列(七)| 从技术架构到团队组织

目录SRE落地与组织架构实践技术架构与组织架构的匹配技术架构示例运维职责分工技术保障体系SRE 多角色团队总结SRE落地与组织架构实践 在落地 SRE 时&#xff0c;很多团队最关心的问题之一就是组织架构&#xff1a;我们究竟需要怎样的团队形态&#xff0c;才能支撑微服务和分…

香港期权市场的主要参与者有哪些?

本文主要介绍香港期权市场的主要参与者有哪些&#xff1f;香港期权市场作为全球重要的金融衍生品市场&#xff0c;其参与者结构呈现多元化、专业化的特征&#xff0c;主要涵盖以下核心群体。香港期权市场的主要参与者有哪些&#xff1f;1. 机构投资者&#xff08;主导力量&…

搜维尔科技:全身可穿戴Teslasuit动捕服的功能,自立式FES装置

功能性电刺激 (FES) 设备广泛应用于康复和医疗实践。其底层技术利用低能量电脉冲&#xff0c;在中风、脊髓损伤、多发性硬化症、脑瘫等各种疾病患者中人工产生身体运动。一般来说&#xff0c;FES系统可以分为三类&#xff1a;开环、有限状态控制和闭环方法。这三种方法描述了 F…

【深度学习新浪潮】MoE是什么技术?

混合专家模型(Mixture of Experts,MoE)是大模型时代提升计算效率与模型能力的核心技术之一。其核心思想是将复杂任务分解为多个子任务,通过动态路由机制激活特定专家网络处理输入数据,从而在保持模型容量的同时大幅降低计算成本。以下是技术细节与实际应用的深度解析: 一…

Java进阶教程,全面剖析Java多线程编程,实现Callable接口实现多线程,笔记05

Java进阶教程&#xff0c;全面剖析Java多线程编程&#xff0c;实现Callable接口实现多线程&#xff0c;笔记05 参考资料 多线程&JUC-05-多线程的第三种实现方式一、实现Callable接口实现多线程 二、三种方式对比 优点缺点继承Thread类编程比较简单&#xff0c;可以直接使…

轨道交通绝缘监测—轨道交通安全的隐形防线

轨道交通绝缘监测作为保障行车安全的核心环节&#xff0c;正面临多重技术与环境挑战。复杂运营环境是首要痛点&#xff0c;隧道内高湿度&#xff08;月均湿度达95%&#xff09;会增大钢轨表面电导率&#xff0c;雾气中的盐分更会加速扣件绝缘性能下降&#xff0c;导致过渡电阻骤…

tar-符号连接(软连接)

1.符号连接是什么符号链接&#xff08;symbolic link&#xff0c;也叫软链接&#xff09;本质上是一个 指向路径的特殊文件。例如&#xff1a;ln -s /etc/passwd passwd_link这会创建一个叫 passwd_link 的文件&#xff0c;但它本身不存放 /etc/passwd 的内容&#xff0c;而是存…

ffmpeg切割音频

ffmpeg切割音频 我希望对指定音频切割&#xff0c;按照开始时间&#xff0c;结束时间&#xff0c;切割成新文件&#xff0c;自动保存&#xff0c;非常好用 step1: from pydub import AudioSegment import os# 配置FFmpeg路径&#xff08;确保路径正确&#xff09; ffmpeg_path …

Python 批量处理:Markdown 与 HTML 格式相互转换

文章目录引言与同类工具的优势对比Python 将 Markdown 转换为 HTMLPython 将 HTML 转换为 Markdown批量转换与自动化处理引言 在多平台内容分发与管理的场景中&#xff0c;文档格式转换已成为内容生态系统中的关键环节。Markdown 作为轻量级标记语言&#xff0c;以其语法简洁、…

御控物联网远程控制水泵启停智能自控解决方案

在农业灌溉、城市排水、工业供水等场景中&#xff0c;水泵作为核心设备&#xff0c;长期面临以下难题&#xff1a;人工依赖度高&#xff1a;需24小时值守&#xff0c;暴雨或干旱时响应滞后&#xff1b; 能耗浪费严重&#xff1a;空转、过载运行导致电费居高不下&#xff1b; …

RedisI/O多路复用:单线程网络模型epoll工作流程

epoll1. 在内核创建eventpoll结构体&#xff0c;返回句柄epfd&#xff08;唯一标识&#xff09;eventpoll包含存放被监听的fd的红黑树&#xff0c;和存放已就绪的fd的链表2. 将要监听的fd加入到epoll红黑树中&#xff0c;并设置callback回调函数callback触发时&#xff0c;就将…

SmartBear API Hub助力MCP开发,无缝、安全的连接AI与外部工具

人工智能&#xff08;AI&#xff09;技术的应用场景日益广泛&#xff0c;如何让不同的AI系统之间实现高效、无缝的交互&#xff0c;成为了业界的重要课题。随着人工智能技术的不断进步&#xff0c;模型上下文协议&#xff08;MCP&#xff09;应运而生。MCP为不同AI系统之间提供…

如何选择高性价比的iOS签名服务?关键因素与价格区间

作为一名摸爬滚打多年的开发者&#xff0c;我来和你聊聊怎么挑一个靠谱又不坑的iOS签名服务。这玩意儿选不好&#xff0c;轻则测试团队干瞪眼&#xff0c;重则App下架&#xff0c;用户投诉&#xff0c;简直是我们开发者的噩梦。别光看价格&#xff01;先想清楚你的核心需求在选…

MoonBit 正式加入 WebAssembly Component Model 官方文档 !

我们非常高兴地宣布&#xff0c;MoonBit 已正式收录在 WebAssembly Component Model 的官方文档中。这不仅是对 MoonBit 技术路线的一次肯定&#xff0c;也让我们有机会和 Rust、Go、C# 等语言一起&#xff0c;出现在开发者查阅组件模型的入口页面中。一、 关于 WebAssembly Co…