学习记录第二十九天

信号量————来描述可使用资源的个数

信号量(Semaphore)是一种用于控制多个进程或线程对共享资源访问的同步机制。在C语言中,通常我们会使用POSIX线程(pthread)库来实现信号量的操作

信号量有两个主要操作:P(等待)和V(释放)

初始化信号量

静态初始化

sem_t sem;  
sem = SEM_INITIALIZER(1); // 初始值为1

动态初始化 

sem_t sem;  
sem_init(&sem, 0, 1); // 第二个参数为0表示信号量是进程内的,初始值为1

 操作信号量

等待(P操作)

sem_wait函数将阻塞调用线程,直到信号量的值大于0。调用成功后,信号量的值减1。

 sem_wait(&sem);

信号(V操作)

sem_post函数将信号量的值增加1,并唤醒正在等待该信号量的一个线程(如果有的话)。

sem_post(&sem);

 

尝试等待(非阻塞)

sem_trywait函数尝试对信号量执行P操作,但如果信号量的值为0,则不会阻塞调用线程,而是立即返回一个错误。 

if (sem_trywait(&sem) == 0)

{

// 成功获取信号量

}

else

{

// 信号量值为0,处理错误

}

 销毁信号量 

sem_destroy(&sem);

sem_t sem_w;
sem_t sem_r;char buf[100] = {0};
void* doSth1(void* arg)
{while(1){sem_wait(&sem_w);printf(">");fgets(buf,sizeof(buf),stdin);sem_post(&sem_r);}
}void* doSth2(void* arg)
{while(1){sem_wait(&sem_r);printf("buf = %s",buf);sem_post(&sem_w);}
}int main(int argc, char *argv[])
{sem_init(&sem_w,0,1);sem_init(&sem_r,0,0);pthread_t tid[2];int ret = pthread_create(&tid[0],NULL,doSth1,NULL);if(ret != 0)handle_error_en(ret,"pthread_create fail");ret = pthread_create(&tid[1],NULL,doSth2,NULL);if(ret != 0)handle_error_en(ret,"pthread_create fail");pthread_join(tid[0],NULL);pthread_join(tid[1],NULL);sem_destroy(&sem_w);sem_destroy(&sem_r);return 0;
}

进程间的通信 

同一主机:古老的通信方式;

                                 管道:通过操作系统提供的内存缓冲区,在内核中实现的通信机制。

                                        有名管道:有名管道则可以跨越无亲缘关系的进程。

                                        无名管道:无名管道只能用于具有亲缘关系的进程间通信

                                  信号:操作系统通过信号来通知进程系统中发生了某种预先规定好的事件。

                      IPC对象通信:

                                   消息队列:在进程之间传递数据的通信机制,通过消息队列标识符进行                                                              通信。

                                   共享内存 :允许多个进程访问同一块物理内存区域。最快的IPC形式之一一                                                        因为进程可以直接访问共享内存中的数据,无需进行数据的复                                                          制。但需要开发者自行负责同步和互斥,以防止数据竞争和一                                                           致性问题。

                                   信号量级:一个计数器,用于控制多个进程对共享资源的访问。

不同主机:socket通信:网络通信 

无名管道

pipe() 函数

通过pipe()函数创建了管道,你就可以在进程间通过它来传递数据了。通常,一个进程(如父进程)会写入管道,而另一个进程(如子进程)会从管道中读取数据。

#include <unistd.h>

int pipe(int filedes[2]);

  • 参数filedes是一个整型数组,用于存储管道的两个文件描述符。filedes[0]用于读管道,filedes[1]用于写管道。
  • 返回值:成功时返回0;失败时返回-1,并设置errno以指示错误。

 pipefd函数

它创建一个管道,并返回两个文件描述符,一个用于读(pipefd[0]),另一个用于写(pipefd[1])

管道的读写规则:
1.读端存在,写管道
  管道空:可以写数据
  管道满:会造成-->写阻塞 
  
2.读端不存在,写管道
  系统会给进程发一个信号SIGPIPE(管道破裂)

3.写端存在,读管道
  管道空,读不到数据,
  这时会造成读操作阻塞

4.写端不存在,读管道 
  如果管道中有数据,则读取这些数据!
  如果没有数据,读操作不阻塞,立即返回!

 管道的特点:

  1. 半双工通信
    管道是半双工的,意味着在同一时间内数据只能沿一个方向流动。如果需要双向通信,必须创建两个管道,一个用于一个方向的通信,另一个用于相反方向的通信。

  2. 基于文件描述符
    管道是通过文件描述符来访问的。在创建管道时,系统返回两个文件描述符:一个用于读(read),另一个用于写(write)。这些文件描述符在文件系统中没有对应的文件,它们是内核中的特殊文件。

  3. 数据流动性
    数据一旦被写入管道,就会被读取端立即读取(如果有进程在读取)。一旦数据被读取,它就会从管道中消失,无法再次被读取(除非有数据复制机制)。这意味着管道不支持像文件那样的随机访问。

  4. 有限容量
    管道有一个有限的容量(65536字节),这取决于系统的实现。如果管道满了,写入操作将会阻塞,直到有足够的空间为止(除非是非阻塞模式或使用了特定的系统调用选项)。类似地,如果管道为空,并且没有进程在写入,读取操作也可能会阻塞。

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

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

相关文章

C语言 ——— 位段(位域)

目录 什么是位段 位段的内存分配 什么是位段 位段的声明和结构体是类似的 但有两个不同&#xff1a; 1. 位段的成员必须是整型家族&#xff1a; int&#xff08;整型&#xff09; &#xff0c;unsigend int &#xff08;无符号整型&#xff09;&#xff0c;sigend int&…

【初阶数据结构题目】32. 希尔排序

文章目录 希尔排序希尔排序的时间复杂度计算 希尔排序 希尔排序法又称缩小增量法。希尔排序法的基本思想是&#xff1a;先选定一个整数&#xff08;通常是gap n/31&#xff09;&#xff0c;把待排序文件所有记录分成各组&#xff0c;所有的距离相等的记录分在同一组内&#x…

歌曲爬虫下载

本次编写一个程序要爬取歌曲音乐榜https://www.onenzb.com/ 里面歌曲。有帮到铁子的可以收藏和关注起来&#xff01;&#xff01;&#xff01;废话不多说直接上代码。 1 必要的包 import requests from lxml import html,etree from bs4 import BeautifulSoup import re impo…

Qt作业合集

8.14作业 设置窗口&#xff0c;按钮&#xff0c;标签&#xff0c;行编辑器&#xff0c;实现快递速运登录页面 #include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {//窗口//设置窗口的标题this->setWindowTitle("邮递系统")…

蚂蚁AL1 15.6T 创新科技的新典范

● 哈希率&#xff1a;算力达到15.6T&#xff08;相当于15600G&#xff09;&#xff0c;即每秒能够进行15.6万亿次哈希计算&#xff0c;在同类产品中算力较为出色&#xff0c;能提高WA掘效率。 ● 功耗&#xff1a;功耗为3510W&#xff0c;虽然数值看似不低&#xff0c;但结合其…

内存泄漏之如何使用Visual Studio的调试工具跟踪内存泄漏?

使用Visual Studio的调试工具跟踪内存泄漏是一个系统性的过程&#xff0c;主要包括启用内存泄漏检测、运行程序、分析内存使用情况以及定位泄漏源等步骤。 Visual Studio提供了多种方式来检测内存泄漏&#xff0c;你可以根据自己的需求选择合适的方法。 注意&#xff1a;下面…

【TiDB】10-对 TiDB 进行 TPC-C 测试

目录 1、安装bench工具 2、插入数据 3、运行测试 4、测试结果分析 4.1、总体性能概览 4.2、事务类型详细性能 4.3、错误事务分析 4.4、结论与建议 5、清理测试数据 TPC-C 是一个对 OLTP&#xff08;联机交易处理&#xff09;系统进行测试的规范&#xff0c;使用一个商…

大数据技术—— Clickhouse安装

目录 第一章 ClickHouse入门 1.1 ClickHouse的特点 1.1.1 列式存储 1.1.2 DBMS的功能 1.1.3 多样化引擎 1.1.4 高吞吐写入能力 1.1.5 数据分区与线程级并行 1.1.6 性能对比 第二章 ClickHouse的安装 2.1 准备工作 2.1.1 确定防火墙处于关闭状态 2.1.2 CentOS取消…

论文阅读笔记:ST-MetaNet-1

目录 前言 摘要 CCS 关键词 介绍 时空相关性的复杂组合 空间相关性 时间相关性 时空相关性的多样性 本篇博客结语 前言 读这篇论文边读边学&#xff0c;每天坚持发博客&#xff0c;看到哪学到哪&#xff0c;这系列文章既有翻译&#xff0c;又有深度详细解释&#xff…

2024开源资产管理系统推荐 8款免费开源IT资产管理系统/软件

开源资产管理系统 开源资产管理系统是帮助企业管理、跟踪和优化其资产的强大工具。这些系统能够自动记录资产的详细信息&#xff0c;如采购日期、使用情况、维护记录等&#xff0c;从而实现资产的全生命周期管理。企业可以通过这些系统优化资产使用效率&#xff0c;减少资产闲…

【瑞芯微RV1126(深度学习模型部署)】部署自己训练的yolov8-seg,实现足型检测!

前言 如果按照本系列第一篇博客那样交叉编译了opencv&#xff0c;那本文有些步骤就不用了&#xff0c;比如交叉编译工具链的下载&#xff0c;所以自己斟酌步骤。 本系列第一篇&#xff1a;https://blog.csdn.net/m0_71523511/article/details/139636367 本系列第二篇&#xff…

数字化转型底座-盘古信息IMS OS,可支撑构建MES/WMS/QCS/IoT等工业软件

在当今这个数字化浪潮汹涌的时代&#xff0c;众多企业纷纷踏上数字化转型之路。对于部分想自研工业软件的企业来说&#xff0c;一个强大、灵活且可扩展的数字化底座显得尤为重要。盘古信息IMS OS&#xff0c;&#xff0c;正是这样一款能够支撑构建MES&#xff08;制造执行系统&…

井字棋游戏(HTML+CSS+JavaScript)

&#x1f30f;个人博客主页&#xff1a;心.c 前言&#xff1a;这两天在写植物大战僵尸&#xff0c;写不动了&#xff0c;现在和大家分享一下之前我写的一个很简单的小游戏井字棋&#xff0c;这个没有AI&#xff0c;可以两个人一起玩&#xff0c;如果大家觉得我哪里写的有一些问…

BQ27441初始化配置程序,电压、SOC等参数读取程序

系列文章目录 1.元件基础 2.电路设计 3.PCB设计 4.元件焊接 5.板子调试 6.程序设计 7.算法学习 8.编写exe 9.检测标准 10.项目举例 11.职业规划 文章目录 前言一、模拟IIC二、BQ27441初始化配置程序三、学习资料 前言 送给大学毕业后找不到奋斗方向的你&#xff08;每周不定…

html+css+js网页制作 自定义电商10个页面

htmlcssjs网页制作 自定义电商10个页面 网页作品代码简单&#xff0c;可使用任意HTML编辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&#xff09;。 获取源码 1&#…

机器学习 第11章-特征选择与稀疏学习

机器学习 第11章-特征选择与稀疏学习 11.1 子集搜索与评价 我们将属性称为“特征”(feature)&#xff0c;对当前学习任务有用的属性称为“相关特征”(relevant feature)、没什么用的属性称为“无关特征”(irrelevant feature)。从给定的特征集合中选择出相关特征子集的过程&a…

UART通信实现与验证(RS485)

前言 UART是一种常用的串行通信协议&#xff0c;RS485则是一种用于长距离和抗干扰的物理层标准。结合UART和RS485可以实现可靠的数据传输&#xff0c;特别是在多点通信和长距离应用中。通过合适的硬件连接、软件配置和验证测试&#xff0c;可以确保这一通信系统的稳定性和数据完…

【刷题笔记】二叉树2

1 二叉树的层序遍历 上一期我们讲了关于二叉树的前序、中序以及后序遍历的相关内容。然而&#xff0c;还存在一种遍历方式&#xff0c;这种方式非常符合我们人类的正常思维&#xff0c;可以求解很多树相关的问题&#xff0c;比较暴力——二叉树的层序遍历。 二叉树的层序遍历与…

读软件开发安全之道:概念、设计与实施01基础

1. 基础 1.1. 实现软件安全既需要运用逻辑&#xff0c;又是一项艺术 1.1.1. 一项仰赖直觉来做出判断的艺术 1.1.2. 需要践行者对当代数字系统有所掌 1.1.3. 需要他们对人与系统之间的交互有所体悟 1.2. 需要准确地思考一下何谓安全 1.2.1. 安全定义的主观性颇强&#xff0…

HarmonyOS开发:跨应用数据共享详解

目录 前言跨应用数据共享的重要性HarmonyOS的数据共享能力相关的基本概念跨应用数据共享的数据管理具体实现跨应用数据共享延伸&#xff1a;数据共享的安全和隐私结语 前言 现在的移动操作系统中&#xff0c;应用之间的数据共享已成为提升用户体验和实现功能互补的重要手段&a…