学习记录第二十九天

news2024/11/13 12:36:04

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

信号量(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.coloradmin.cn/o/2049011.html

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

相关文章

【学习总结】JVM篇

JVM JVM基础知识 主力机型 HotSpot VM HotSpot虚拟机时OpenJDK和OracleJDK中默认的Java虚拟机。它最初并非由Sun公司所开发&#xff0c;而是由一家名为“Longview Technologies”的小公司设计。Sun公司注意到这款虚拟机在即时编译等多个方面有着优秀的理念和实际成果&#…

【Redis】字符串数据类型深入解析与应用实践

目录 String 字符串常⻅命令计数命令其他命令命令⼩结内部编码典型使⽤场景 String 字符串 字符串类型是 Redis 最基础的数据类型&#xff0c;关于字符串需要特别注意&#xff1a;1&#xff09;⾸先 Redis 中所有的键的类型都是字符串类型&#xff0c;⽽且其他⼏种数据结构也都…

牙科就诊管理系统--论文pf

TOC springboot399牙科就诊管理系统--论文pf 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进行科学化&#xff0c;…

企业考勤管理神器:9款精选软件推荐

本文将介绍9款考勤管理软件&#xff1a;Moka、超人HR、慧点、云易通、麦勤通、TeKard考勤管理系统、Toggl Track、ZoomShift、Kronos Workforce Ready。 选择合适的考勤管理软件对企业来说可不是件小事。面对市场上琳琅满目的工具&#xff0c;选错了不仅浪费时间和金钱&#xf…

【二分查找】--- 初阶题目赏析

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏&#xff1a; 算法Joureny 上篇我们讲解了关于二分的朴素模板和边界模板&#xff0c;本篇博客我们试着运用这些模板。 &#x1f3e0; 搜索插入位置 &#x1f4cc; 题目…

如何使用和配置 AWS CLI 环境变量?

欢迎来到雲闪世界。环境变量在配置和保护应用程序方面起着至关重要的作用&#xff0c;在使用 AWS CLI&#xff08;命令行界面&#xff09;时&#xff0c;它们的使用尤其重要。在这篇博客文章中&#xff0c;我们将深入探讨环境变量的世界&#xff0c;探索它们的用途、它们在 AWS…

【Python】OBS 脚本

文章目录 一、指定python解释器和脚本二、特殊函数名三、obspython API四、 实际应用示例(mkv转mp4封装后自动删除mkv)OBS Studio是一个流行的开源软件,用于视频录制和直播。除了其内置功能外,OBS还支持通过Python脚本(以及lua脚本)进行扩展,允许用户自定义和自动化各种…

JS模块化总结 | CommonJS、ES6

BV13W42197jR 个人笔记 目录 JS模块化基础知识1. 概述1.1 什么是模块化1.2 为什么需要模块化? 2 模块化规范3 导入&导出4 CommonJS规范4.1 初步体验4.2 导出数据4.3 导入数据4.4 扩展理解4.5 浏览器端运行 5 ES6模块化规范5.1 初步体验5.2 Node中运行ES65.3 导出数据①分别…

C++ 设计模式——工厂方法模式

工厂方法模式 工厂方法模式主要组成部分代码实现工厂方法模式模式的 UML 图工厂方法模式 UML 图解析优点和缺点适用场景 工厂方法模式 工厂方法模式是一种创建型设计模式&#xff0c;它通过定义一个接口用于创建对象&#xff0c;但由子类决定实例化哪个类。与简单工厂模式不同…

笔记 5 : 彭老师课本第 5 章 , 开始代码编程

&#xff08;49&#xff09;大纲&#xff1a; &#xff08;50&#xff09; 系统&#xff1a; &#xff08;51&#xff09; 学习路线&#xff1a; &#xff08;52&#xff09;该款 soc 的内存布局&#xff1a; 细化的 SFR 地址空间 &#xff1a; &#xff08;53&#xff09; soc…

IMX8M核心板偶发系统启动失败排查实录

一. 基本情况介绍 1. 硬件方案组成 产品中采用的是IMX8M核心板的方案&#xff0c;如图1所示是产品的硬件系统整体组成示意图。 图1 产品硬件组成框图 2. 问题描述 今年5月份有一台设备出现系统偶发启动失败&#xff0c;uboot阶段都无法通过&#xff0c;表面现象是显示屏黑屏…

Android持久化技术—SharedPreferences存储

文章目录 Android持久化技术—SharedPreferences存储将数据存储到SharedPreferences中Context类中的getSharedPreferences()方法Activity类中的getPreferences()方法PreferenceManager类中的getDefaultSharedPreferences()方法 从SharedPreferences中读取数据 Android持久化技术…

【自动驾驶】ROS远程节点的分布式通信

目录 固定IP的设置将IP地址改成手动配置文件修改配置主从机的~/.bashrc 文件配置主机的 IP 地址配置从机IP ROS是一个分布式计算环境。一个运行中的ROS系统可以包含分布在多台计算机上多个节点。根据系统的配置方式&#xff0c;任何节点可能随时需要与任何其他节点进行通信。 …

XSS靶场————XSS.pwnfunction

目录 第一关&#xff1a;Ma Spaghet! 第二关&#xff1a;Jefff 第三关&#xff1a;Ugandan Knuckles​编辑 第四关&#xff1a;Ricardo Milos ​编辑 第五关&#xff1a;Ah Thats Hawt​编辑 第六关&#xff1a;Ligma 第七关&#xff1a;Mafia​编辑 第八关&#xff1a…

交易系统JVM内存优化

背景 新交易系统上线以后&#xff0c;业务指标&#xff08;成单率&#xff09;和系统指标&#xff08;CPU、QPS、JVM内存&#xff09;是我们重点关注的指标。 CPU较高&#xff1a;可以通过Arthas等工具查看繁忙线程的堆栈信息&#xff0c;定位具体的代码&#xff0c;具体分析…

谷歌浏览器字体模糊不清怎么办

许多小伙伴在使用谷歌浏览器时&#xff0c;可能都遇见过字体模糊不清的情况&#xff0c;这将对我们的浏览体验大打折扣。为了解决这以问题&#xff0c;本文将为大家带来谷歌浏览器字体模糊不清的解决方法&#xff0c;帮助你享受到更清晰舒适的阅读环境。&#xff08;本文由chro…

聚星文社AI工具官方

聚星文社是一键AI推文生成工具超强功能极速版介绍聚星文社AI工具官方https://docs.qq.com/doc/DRU1vcUZlanBKR2xy 同时集成原创和反推搬运功能 并可一键切换MJ或SD进行批量出库 一键自动智能分镜或手动快速分镜 精准排布镜头功能全预设 超简化流程 3秒即可完成参数配置全网最全…

Java 并发(五)—— 线程池

线程池核心参数&#xff1f;&#xff08;核心线程数、最大线程数、任务队列&#xff09;线程池构造方法中除了保存参数以外还要做什么事&#xff1f;&#xff08;设置线程工厂、任务拒绝策略&#xff09;提交任务时线程池要做什么&#xff1f;&#xff08;任务执行机制&#xf…

Golang Map 深度剖析:原理、实践与面试要点

嘿,小伙伴们!我是 k 哥。今天,咱们来聊聊 Map 。 在 Go 语言这个神奇的世界里,Map 这个有点神秘的数据结构一直都是开发者们特别关注的。 你是不是在用 Map 的时候,对它里面咋工作的感到好奇?是不是碰到复杂操作的时候,特别想弄明白它背后的原理?别着急,今天这篇文章…

Java流程控制06:嵌套for循环

本节教学视频链接&#xff1a;https://www.bilibili.com/video/BV12J41137hu?p41&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5https://www.bilibili.com/video/BV12J41137hu?p41&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 在Java中&#xff0c;‌嵌套for循环是指将…