当前位置: 首页 > news >正文

线程间同步机制与进程间通信

线程间同步机制用于协调多个线程的执行顺序,确保任务按预期顺序执行。异步执行是多线程和多进程的本质,CPU调度具有随机性。信号量是实现线程间同步的一种机制。

信号量操作步骤

定义信号量对象:

sem_t sem;

初始化信号量:

sem_init(&sem, 0, 1);  // 初始值为1,线程间共享

PV操作:

     P操作(申请信号量):

sem_wait(&sem);  // 申请信号量

       V操作(释放信号量):

    sem_post(&sem);  // 释放信号量
    

    销毁信号量:

    sem_destroy(&sem);
    

    函数接口说明

    初始化信号量:

    int sem_init(sem_t *sem, int pshared, unsigned int value);
    

        sem:信号量对象地址

        pshared:0表示线程间共享,非0表示进程间共享

       value:信号量初始值

    申请信号量:

    int sem_wait(sem_t *sem);
    

    释放信号量:

    int sem_post(sem_t *sem);
    

    销毁信号量:

    int sem_destroy(sem_t *sem);
    

    死锁与解决方法

    死锁是多线程环境中因资源竞争导致的永久等待状态。产生死锁的四个必要条件:

    1. 互斥条件:资源每次只能被一个线程使用
    2. 请求与保持条件:线程持有资源并请求其他资源
    3. 不剥夺条件:线程持有的资源不能被强制释放
    4. 循环等待条件:多个线程形成循环等待资源链

    解决方法

            锁成对出现

            统一加锁顺序

            破坏循环等待条件

            使用非阻塞锁

    进程间通信(IPC)

    进程间通信因空间独立而需要特殊机制。通信方式分为同一主机和不同主机两类。

    同一主机通信方式

    1. 古老通信方式
      • 无名管道
      • 有名管道
      • 信号
    2. IPC对象通信
      • 共享内存
      • 消息队列
      • 信号量集

    不同主机通信方式

            Socket通信

    无名管道操作 创建管道:

    int pipe(int pipefd[2]);
    

        pipefd[0]为读端,pipefd[1]为写端

      读写操作:

      write(pipefd[1], buf, len);  // 写管道
      read(pipefd[0], buf, len);   // 读管道
      

      关闭管道:

      close(pipefd[0]);  // 关闭读端
      close(pipefd[1]);  // 关闭写端
      

      有名管道操作 创建管道文件:

      int mkfifo(const char *pathname, mode_t mode);
      

         pathname:管道文件名称

         mode:文件权限

      打开和读写:

      int fd = open(pathname, O_RDWR);  // 打开管道
      write(fd, buf, len);              // 写管道
      read(fd, buf, len);               // 读管道
      close(fd);                        // 关闭管道
      

      删除管道文件:

      remove(pathname);
      

      ips:1.代码编写时,注意的事项。

      高内聚:增强代码的复用性。

      低耦合:设计程序时,模块与模块之间(函数与函数之间)的关联度要低。

      2.代码设计时,注意的事项。

      开闭原则:对增加开放,对修改关闭。

      3.互斥锁在全局变量初始化时,可以使用系统中的一个宏

      4.void *memset(void *s, int c, size_t n);

              功能:将内存区域填充成指定的数据

              参数:

                      s:要填充的空间首地址

                      c:要填充的地址

                      n:要填充的字节数

              返回值

                      成功:返回s的首地址

                      失败:NULL

      5.单工:广播(管道)

      半双工:对讲机

      全双工:打电话
      ————————————————

                                  版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

      原文链接:https://blog.csdn.net/weixin_72612809/article/details/150484626

      http://www.dtcms.com/a/337931.html

      相关文章:

    • 数据处理和统计分析 —— Pandas 基础(附数据集)
    • SMTPman,smtp ssl助力安全高效邮件传输!
    • redhat9从github下拉软件包一直报错
    • petalinux2023.1编译pmu-rom-native...fetch error问题
    • 39-Linux下安装python
    • BPO(Business Process Optimization,业务流程优化)
    • FPGA驱动量子革命:微美全息(NASDAQ:WIMI)实现数字量子计算关键验证
    • 任务六 歌手页面功能开发
    • single cell ATAC(11)ArchR鉴定标记Peak
    • Spring AI RAG 检索增强 应用
    • RAG深入解读:文本分块、混合检索、重排序、bge微调(工程落地实践)
    • Android 流式布局实现方案全解析
    • Android输入框文字不垂直居中
    • Maven Shade Plugin 插件使用说明
    • 【音视频】ISP能力
    • 阿里云odps和dataworks的区别
    • 多数据源 Demo
    • 机器学习之数据预处理(二)
    • HBM CPU Cache / GPU Cache 的关系
    • 第一阶段C#-14:委托,事件
    • ubuntu 下载安装tomcat简单配置(傻瓜式教程)
    • minio安装和配置
    • JUC读写锁
    • 视觉语言导航(7)——VLN的数据集和评估方法 3.2
    • openfeign 只有接口如何创建bean的
    • C++多线程编程深度解析【C++进阶每日一学】
    • 【损失函数】完全解析(两万字解读)
    • 现有网络模型的使用及修改
    • 一般情况下,python函数都会返回对象,但有时只调用一个函数,这是在修改这个信息
    • CAG缓存增强生成与RAG检索增强生成对比