信号量也属于一种进程间通信的机制,与其他的进程间通信不同,信号量不是用来传输数据的,而是用来进程间同步与互斥。除此之外,信号量还可以实现线程间的互斥

信号量是什么?

信号量的本质是一个计数器。

一个信号量是由一个内核维护的整数,它的值被限制在大于等于0。对信号量可以进行以下操作:

1、将信号量设置一个值。

2、在信号量当前值的基础上加上一个数量(V操作)。

3、在信号量当前值的基础上减去一个数量(P操作)。

4、当信号量的值为0时,会被阻塞。

既然是计数器,那么其中的count也是临界资源,所以PV操作必须得是原子的。

Linux下信号量的P.V操作如何保证其原子性_weixin_34402090的博客-CSDN博客

P操作

相当于count--;

P(){lock();if(count)count--;elsewait(); // 阻塞unlock();
}

V操作

相当于count++

V(){lock();count++;if(count<=0)wakeup();//唤醒unlock();
}

注意:V操作的唤醒进程或者线程是不确定的,即具体是哪个进程或者线程被唤醒并允许递减这个信号量是不确定的,仅仅是一个同步机制,而不是一个排队机制。


POSIX信号量

头文件 semaphore.h

1、初始化一个信号量

sem_init函数

sem_t 声明一个信号量;

sem_init函数使用value中指定的值对sem指向的信号量进行初始化。通俗一点就是给信号量中的count值赋一个初值。

第二个参数要注意

pshared表明这个信号量是在线程间共享还是在进程间共享。

如果pshared=0,这个信号量会在调用进程中的线程间进行共享。此时这个信号量应该为临界资源,让线程都可以看到。

如果pshared=1,这个信号量在进程间共享。此时需要放在内存共享区,即共享内存或者mmap映射区域。

2、P操作

sem_wait()函数

sem_wait函数就是让sem指向的信号量的值减1.

如果信号量的当前值大于0,则sem_wait立即返回。如果信号量的当前值小于0,那么sem_wait会阻塞到信号量的值大于0为止。

3、V操作

sem_post函数

sem_post函数就是将sem指向的信号量的值+1。

如果在sem_post调用之前信号量的值为0,并且其他某个进程(线程)正在因为等待递减这个信号量而阻塞,那么该进程(线程)会被唤醒。

4、销毁一个信号量

sem_destroy函数

sem必须被sem_init初始化才能被销毁。

只有在不存在进程或线程在等待一个信号量时才能够安全销毁这个信号量。


用信号量实现线程互斥

用信号量来代替互斥锁mutex。

思想:将信号量设置为0,1两个状态,这样就可以达到互斥锁的效果。

//一个简单的抢票程序
#include <iostream>
#include <semaphore.h>
#include <pthread.h>
#include <unistd.h>
using namespace std;
class myclass
{
private:sem_t mtx;int ticket = 5000;
public:myclass(){sem_init(&mtx, 0, 1);//设置大小为1即和锁一样的特点}~myclass(){sem_destroy(&mtx);}void P()//封装一下PV操作的函数{sem_wait(&mtx);}void V(){sem_post(&mtx);}void Run(){pthread_t tid[4];for (int i = 0; i < 4; i++)//创建四个线程pthread_create(tid + i, nullptr, Routine, this);for (int i = 0; i < 4; i++)pthread_join(tid[i], nullptr);}static void* Routine(void* arg){myclass* ptr = (myclass*)arg;while (1){ptr->P();if (ptr->ticket > 0){usleep(1000);cout << "i am thread " << pthread_self() << ", i get tikcet num is " << ptr->ticket << endl;(ptr->ticket)--;ptr->V();}else{ptr->V();break;}}return nullptr;}
};
int main()
{myclass mc;mc.Run();return 0;
}

Linux操作系统-信号量相关推荐

  1. linux课程设计死锁避免,linux操作系统课程设计—车辆死锁.doc

    linux操作系统课程设计-车辆死锁.doc 键入文字"操作系统原理"课程设计BX090709吴沛儒操作系统原理课程设计报告姓名吴沛儒班级BX0907学号9指导老师胡静二〇一一年十 ...

  2. Linux 操作系统原理 — 进程与线程管理

    目录 文章目录 目录 前言 进程与线程 内核线程,用户线程与轻量级进程 内核线程 轻量级进程 用户线程 轻量级进程与用户线程的区别 用户线程与轻量级进程的混合模式 用户线程和内核线程的区别 线程的实现 ...

  3. linux c语言 ppt,linux操作系统下c语言编程入门.ppt

    linux操作系统下c语言编程入门.ppt Linux操作系统下C语言编程入门 CNT Linux操作系统简介基础知识进程介绍文件操作时间概念消息管理线程操作网络编程Linux下C开发工具介绍 一 L ...

  4. (第五篇)Linux操作系统基本结构介绍

    Linux操作系统基本结构介绍 Linux系统一般有4个主要部分:内核.shell.文件系统和应用程序.内核.shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序.管理文件并使用 ...

  5. 网上linux实验平台,Linux操作系统实验教程

    第一部分 Linux操作系统基本原理. 第1章 Linux操作系统简介 1.1 Linux的渊源和发展简史 1.2 Linux的基本特性 1.3 Linux内核的开发模式与内核版本号 1.4 Linu ...

  6. linux系统基础与应用,Linux操作系统:基础、原理与应用

    <Linux操作系统:基础.原理与应用> 第1部分基础篇 第1章操作系统概述/3 1.1认识操作系统3 1.1.1操作系统的概念3 1.1.2操作系统的功能4 1.2操作系统的发展与现状5 ...

  7. Linux操作系统下进程讲解(史上最强总结)

    Linux操作系统下进程讲解 一.进程的基本概念: 1. 什么是进程 在传统的操作系统中,程序不可以独立的运行,作为资源分配和独立运行的基本单位都是进程.进程的定义是一个可执行中程序的实例,系统中每一 ...

  8. Linux操作系统基础知识学习

    Q1.什么是GNU?Linux与GNU有什么关系? A: 1)GNU是GNU is Not Unix的递归缩写,是自由软件基金会(Free Software Foundation,FSF)的一个项目, ...

  9. 怎样把电脑换linux系统软件,如何将OS/2应用程序移植到Linux操作系统 -电脑资料...

    当从 OS/2 移植到 Linux 时,关键的编程问题是什么? 在转换到 Linux 之前注意一下,提早发现陷阱, 本文是 LAN Distributed Platform(LANDP)for Lin ...

最新文章

  1. 中职计算机专业论文,中职教学中计算机专业论文
  2. 【LeetCode】-- 260. Single Number III
  3. Codeforces 986A. Fair(对物品bfs暴力求解)
  4. docker 不包含依赖 打包_Docker容器技术(概念篇)
  5. MySQL非等值连接
  6. 全局变量和局部变量命名规则_变量范围和LEGB规则
  7. 泰晤士“中国学科评级”结果出炉,中国数学学科评级榜单公示!
  8. C/C++ OpenCV直方图均衡化
  9. 《信息可视化:交互设计(原书第2版)》——1.1节可视化
  10. 深入浅出-iOS函数式编程的实现 响应式编程概念
  11. 复联4定档 4.24——十一年21部漫威电影,用数据为你梳理口碑、票房、主演最佳...
  12. Drillbeach---第一章 Drillbench 5.1发行说明
  13. 《生命中不能承受之轻》读书笔记
  14. 加州房价篇 (三) : 模型的训练,评估和房价的预测
  15. Linux查看MegaSAS raid卡缓存策略
  16. oracle索引介绍
  17. 2022年湖南省证券从业资格(证券投资基金)练习题及答案
  18. 论文期刊快速发表的方法
  19. 研华安装Linux系统,在自带显卡GeForce RTX 2070的研华MIC-770工控机上安装Ubuntu18.
  20. Linux安装云原生网关Kong/KongA

热门文章

  1. 简述对面向对象思想的理解
  2. 重写与重载的区别和用途
  3. chromium 设置标签栏字体大小
  4. CSS 几款比较常用的翻转特效(转载)
  5. 向前欧拉公式 matlab_【物理公式】世界上最伟大的十大公式
  6. 【IoT】创业:如何找到可以主导的创业市场?
  7. EasyDSS点播H.265格式的MTS文件,视频前10秒无法播放该如何解决?
  8. 北京个人ADSL和企业ADSL有什么区别啊?
  9. 十一放假通知!假期有变,都看看吧
  10. html实现选择头像,在网页中实现OICQ里的头像选择的下拉框 (附例子)