IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> 线/进程间同步互斥和进程间通信机制 -> 正文阅读

[系统运维]线/进程间同步互斥和进程间通信机制

一、线/进程间同步互斥

(1)互斥:一个进程或者线程是否可以获得资源的使用权
(2)同步:对资源是否能够有序访问

1.互斥机制

(1)互斥锁

  • pthread_mutex_init();//初始化锁(因为线程共享进程的资源,所以可以在进程中将锁声明为全局或静态变量)
  • pthread_mutex_destroy(); //释放锁
  • pthread_mutex_lock(); //获得锁,此时只有本线程能访问资源。如果锁被其他线程占用,这里无法获得锁,则本线程睡眠
  • pthread_mutex_trylock(); //获得锁。 如果锁被其他线程占用,这里会执行失败,返回EBUSY
  • pthread_mutex_unlock(); //资源调用完成后,释放锁

(2)自旋锁

  • DEFINE_SPINLOCK(lock);
  • spin_lock(&lock);
  • spin_unlock(&lock);

跟互斥锁的区别: 互斥锁如果获取不到锁会睡眠,自旋锁如果获取不到锁,会一直循环检测这把锁什么时候被别的线程释放,然后再上锁。
缺点: 一直占用CPU资源,如果线程等待时间比较长,CPU的效率就会下降

2.同步机制

(1)信号量

  • sem_t sem ; //声明一个信号量
  • sem_init(); //初始化信号量,这里信号量的值可以是多个
  • sem_wait(); //获得信号量,信号量的值减1 P操作
  • sem_post(); //释放信号量,信号量的值减1 V操作

可以定义多个信号量,初始化时给信号量赋值一个数就行,但一般只初始化一个信号量,用于2个线程

(2)条件变量

  • pthread_cond_t cond; //创建条件变量

  • pthread_cond_init(); //初始化条件变量

  • pthread_cond_destroy(); //

  • pthread_cond_wait(); //等待唤醒

  • pthread_cond_broadcast(); //唤醒所有等待这个条件变量的线程

  • pthread_cond_signal(); //唤醒某一个等待这个条件变量的线程

    条件变量和互斥锁一般搭配使用,用条件变量唤醒这个线程后,用互斥锁把资源锁死,只能本线程调用,工作都做完以后,再释放互斥锁,需要的话再唤醒另一个线程继续执行

二、进程间通信机制

1.无名管道(pipe)

2.有名管道(fifo)

3.消息队列(本质:一个消息的链表)

  • ftop(); //创建KEY,通过KEY来判断自己操作哪一个消息队列

  • msgget(key,属性); //创建或打开消息队列。属性:IPC_CREAT - 消息队列不存在则创建,存在则打开

  • msgsnd(); //发送消息;其中有一个指针用来表示要发送的消息,一般是一个消息结构体

  • msgrcv(); //接收消息

  • msgctl(); //操作消息队列,比如删除

      比如:用BOA服务器搭了一个网页,网页端跟嵌入式主控程序之间就可以通过消息队列传输数据
    

4.共享内存(最快的,效率最高的通信方式,因为操作的是同一个内存空间)

  • shmget(); //创建共享内存
  • shmat(); //映射共享内存
  • shmdt(); //接触映射
  • mmap(); /

5.信号量

6.socket套接字(TCP、UDP通信)

  • socket();创建socket套接字
  • 注册网络协议族
  • bind()绑定
  • listen()监听
  • connect()连接
  • accept()接受连接
  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-04-07 23:07:00  更:2022-04-07 23:09:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 21:35:26-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码