Posix信号灯和SystemV信号灯解析

POSIX多线程笔记(7):信号量(Semaphore) 信号量的概念 1965年,E.W.Dijkstra提出了信号量的概念,之后信号量即成为操作系统实现互斥和同步的一种普遍机制。信号量是包含一个非负整型变量,并且带有两个原子操作wait和signal。wait还可以被称为down、P或lock,signal还可以被称为up、V、unlock或post。 如果信号量的非负整形变量S大于零,wait就将其减1,如果S等于0,wait就将调用线程挂起。对于... 阅读详情


暑假那会把UNPv2大概过了一遍,不过没有总结,除了pipe,所以现在都忘得差不多了,趁最近几天学操作系统,边学边回顾一下。


信号灯(semaphore)是一种用于提供不同进程间或一个给定进程的不同线程的同步手段的原语。

我所知一共有三种类型信号灯:

  • Posix有名信号灯:使用Posix IPC名字标识,可用于进程或现程间的同步
  • Posix基于内存的信号灯:存放在共享内存区,可用于进程或线程间的同步
  • System V信号灯:在内核中维护,可用于进程或线程间的同步
Posix 有名信号灯,有名信号灯可能与文件系统中路径的名字来标识的。我们在使用Posix有名信号灯是,可以使用ll /dev/shm查看是否成功打开了信号灯。

Posix 基于内存的信号灯,基于共享内存的信号灯和有名信号灯虽然实现机制不一样,但在编程中仅有创建和销毁两个函数不一样。

System V信号灯:


此外,如果按值来区分,信号灯有普通信号灯和二值信号灯之分。后者大致相当于mutex,不过后者可被不同进程或线程解锁,而mutex只能被持有锁的线程解锁。


下面给出信号灯、互斥锁、条件变量之间的三个差异:

  1. 互斥锁必须总是由给它上锁的线程解锁,信号灯则可以由其它线程解锁。
  2. 互斥锁要么被锁住,要么被解开(二值状态,类似于二值信号灯)
  3. 既然信号灯有一个与之关联的状态(它的计数值),信号灯挂出操作总是被记住。然而当向一个条件变量发送信号时,如果没有线程等待在该条件变量上,那么该信号将丢失(丢失就是好像没出现过这货一样)。

一:Posix有名信号灯




Posix有名信号灯编程函数:

sem_t *sem_open(const char *name, int oflag);
sem_t *sem_open(const char *name, int oflag,
                     mode_t mode, unsigned int value);
name:打开信号灯,name是给信号灯起的名字,也就是信号灯对应在文件系统中的路径,加入你打开了一个信号灯,该信号灯是随内核持续的,就算你的程序结束了,信号灯             依然存在,ll /dev/shm即可看到。销毁信号灯需要程序中调用unlink函数(对于使用内存的信号灯而言是destroy函数)或者机器重启,调用close函数也不行。
oflag:打开方式,常用O_CREAT | O_EXCL,IPC这几个家伙几乎都用这两个
mode:文件权限。常用#define FILE_MODE   (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH),本用户可读可写,同组用户可读,其他用户读。
value:信号量值。二元信号灯值为1,普通的话,就用来表示资源数目就行。

注意的是:出错返回值的定义 #define SEM_FAILED ((sem_t*)(-1))

int sem_close(sem_t *sem);
这个函数虽说close,实际没什么乱用,即便不使用该函数,eixt或_exit的时候也会自动关闭信号灯。但是不能从系统中删除。失败返回-1。

int sem_unlink(const char* name);
name:信号灯对应的文件系统名字。
该函数作用是将信号灯从文件系统删除。

int sem_wait(sem_t *sem);
int sem_trywait(sem_t *sem);
让信号灯减1,信号灯值已经是0的话,调用线程将阻塞。try_wait函数则不会阻塞,会返回EAGAIN错误。如果某个信号中断,sem_wait就可能过早地返回,所返回的错误为EINTR。

int sem_post(sem_t *sem);
与上面函数作用相反,加1函数。

int sem_getvalue(sem_t* sem, int *valp);
使用Int*获得当前信号灯的值。


下面是使用有名信号灯写的单生产者单消费者模型:
#include "../unp.h"

#define NBUFF 10
#define SEM_MUTEX "mutex"   //thers are args to ipc name.
#define SEM_NEMPTY "nempty"
#define SEM_NSTORED "nstored"

int nitems;   //read-only by producer and consumer
struct {
    int    buff_[NBUFF];
    sem_t* mutex_;
    sem_t* nempty_;
    sem_t* nstored_;
} shared;

void *produce(void *), *consume(void *); 

int main(int argc, char** argv)
{
    if(argc != 2)
        err_quit("usage: prodcons1 <#items>");
    nitems = atoi(argv[1]);

    //create three semephore
    shared.mutex_ = sem_open(SEM_MUTEX, O_CREAT | O_EXCL, FILE_MODE, 1);  //1 
    assert(shared.mutex_ != (sem_t*)(-1));
    shared.nempty_ = sem_open(SEM_NEMPTY, O_CREAT | O_EXCL, FILE_MODE, NBUFF);  //NBUFF
    assert(shared.nempty_ != (sem_t*)(-1));
    shared.nstored_ = sem_open(SEM_NSTORED, O_CREAT | O_EXCL, FILE_MODE, 0);  //0 
    assert(shared.nstored_ != (sem_t*)(-1));

    //create one producer thread and one consumer thread
    int ret = 0;
    pthread_t tid_produce, tid_consume;
    ret = pthread_create(&tid_produce, NULL, produce, NULL);
    assert(ret != -1);
    ret = pthread_create(&tid_consume, NULL, consume, NULL);
    assert(ret != -1);
    
    //wait for the two threads
    pthread_join(tid_produce, NULL);
    pthread_join(tid_consume, NULL);
    
    sem_unlink(SEM_MUTEX);
    sem_unlink(SEM_NEMPTY);
    sem_unlink(SEM_NSTORED);
    exit(0);
}   

void *produce(void *)
{
    for(int i=0; i<nitems; ++i){
        sem_wait(shared.nempty_);
        sem_wait(shared.mutex_);
        shared.buff_[i%NBUFF] = 1;
        printf("producer produce the %d=%d\n", i, shared.buff_[i]);
        sem_post(shared.mutex_);
        sem_post(shared.nstored_);
    }
}
void *consume(void *)
{
    for(int i=0; i<nitems; ++i){
        sem_wait(shared.mutex_);
        sem_wait(shared.nstored_);
        shared.buff_[i%NBUFF] = 0;
        printf("consumer consume the %d=%d\n", i, shared.buff_[i]);
        sem_post(shared.mutex_);
        sem_post(shared.nempty_);
    }
}


二:Posix基于内存的信号灯



基于内存的信号灯和有名信号灯变成基本都是一样的。有名信号灯天生支持不同进程间共享,基于内存的信号的通过是指SHARED来确定是否除了本进程内部线程共享其他进程也要共享。

它们两种只有两个函数有区别:
int sem_init(sem_t *sem, int shared, unsigned int value);
初始化信号灯。sem参数必须指向有应用程序分配的sem_t变量。如果shared为0,那么待初始化的信号灯是在同一进程中的各个线程间共享的,否则该信号灯是在进程间共享的。当shared为非零时,该信号灯必须存放在即将使用它的所有进程都能访问的某种类型的共享内存中。value是初始值。

int sem_destroy(sem_t* sem);
使用完一个基于内存的信号灯后,我们调用sem_destroy摧毁它。

代码示例就不写了,和上面只差两个函数。

Posix定义了两个信号灯的限制,可通过sysconf函数查看:
  1. SEM_NSEMS_MAX    一个进程可同时打开着的最大信号灯数(Posix要求至少为256)
  2. SEM_VALUE_MAX     一个信号灯的最大值(Posix要求至少为32767)


三:System V信号灯



System V信号灯通过定义如下概念给信号灯增加了另外一级复杂度:
  • 计数信号灯集(set of counting semaphore):一个或多个信号灯(构成一个集合),其中每个都是计算信号灯。每个集合的信号灯数存在一个限制,一般在25个数量级上。当我们谈论“System V信号灯”时,所指的是计数信号灯集。当我们谈论“Posix信号灯”时,所指的是单个计数信号灯。

对于系统中的每个信号量集,内核维护一个如下的信息结构:
struct semid_ds {
    struct ipc_permsem_perm ;
    structsem*    sem_base ; //信号数组指针
    ushort        sem_nsem ; //此集中信号个数
    time_t        sem_otime ; //最后一次semop时间
    time_t        sem_ctime ; //最后一次创建时间
} ;

某个给定信号量的结构体:
struct sem {
    ushort_t  semval ;  //信号量的值
    short     sempid ;  //最后一个调用semop的进程ID
    ushort    semncnt ; //等待该信号量值大于当前值的进程数(一有进程释放资源 就被唤醒)
    ushort    semzcnt ; //等待该信号量值等于0的进程数
} ; 


System V信号量常用函数:
key_t  ftok(char *pathname,  char proj); 

根据参数pathname和proj来创建一个关键字,成功时返回与路径pathname相对应的一个键值,具有唯一性,失败时返回值为-1.

int  semget (key_t  key,  int  nsems ,  int  semflg);

创建一个新信号量或者取得一个现有的信号量,key是一个关键字,可以是用ftok()函数创建的,也可以是IPC_PRIVATE(/usr/include/bits$ vi ipc.h),nsems表明创建的信号量个数,semflg是设置信号量的访问权限标志,函数调用成功时返回信号量ID,失败则返回-1.

int semop (int semid, struct sembuf *spos, int nspos);

对信号量进行操作的函数,用于改变信号量的键值,semid是信号量的标志,spos是指向一个结构体数组的指针,表明要进行什么操作,nspos表明数组的元素个数,调用成功则返回0,失败则返回-1。/usr/include/linux$ vi sem.h  (sembuf \ semun)

 Struct sembuf  
 {
    Unsigned short sem_num; /*sem index in array*/
    Short sem_op; /* sem operation */
    Short sem_flg;/* operation flags */ sem_flg&IPC_RND 0
};

其中,如果sem_op大于0,那么操作值加入到信号量的值中,并唤醒等待信号增加的进程,如果sem_op为0,当信号量的值是0的时候,函数返回,否则阻塞直到信号量的值为0,如果sem_op小于0,函数判断信号量的值加上这个负值,如果结果为0唤醒等待信号量为0的进程,如果小于0函数阻塞,如果大于0,那么从信号量里面减去这个值并返回。

int semctl (int semid, int semnum, int cmd,  union semun arg);

该函数得作用是对信号量进行一系列得控制,semid是要操作得信号量标志,semnum是信号量的下标,cmd是操作的命令,经常用的两个命令是:SETVAL、IPC_RMID,arg用于设置或返回信号量信息。

 Union semun
{
    int val;
    struct semid_ds *buf;
    unsigned short *array;
    struct seminfo *__buf;
    void *__pad;
}



















OpenClaw部署太难?汉化版+中文社区+国产替代品,国内用户零门槛指南 OpenClaw作为GitHub 10万+星的开源AI助手平台,近期在国内AI圈备受关注 🌟 但部署难度和英文界面让很多用户望而却步。本文整理了针对国内用户的友好资源和简便替代方案,帮助国内用户零门槛上手AI助手工具 🚀 阅读详情

相关推荐

【VMware篇】7-通过ISO镜像升级VMware Esxi

本文主要介绍Dell服务器上安装的ESXi升级的方法之一(采用ISO升级)。

chen_yunan的博客 5511

Python posix_ipc库:进程间共享内存访问示例(跨程序)(使用信号量semaphore防止同时访问共享内存,避免数据冲突)

库,重点是如何使用它来实现不同Python程序对同一块共享内存的访问。通过共享内存,可以实现数据的即时共享和低延迟通信。同时,使用信号量可以防止同时访问共享内存,避免数据冲突。创建了共享内存后,需要将其映射到当前进程的地址空间才能进行读写操作。这个程序创建了一个大小为4096字节的共享内存段,并写入了4字节的数据。的信号量,并将其值设为0。然后,写入共享内存并通过增加信号量的值释放它。然后,等待信号量(阻塞),直到它的值大于0,然后读取共享内存。这会在系统中创建一个新的共享内存段,其大小为4096字节。

Dontla的博客 3307

XILINX偶然加载不成功的问题原因及解决方法

本文为明德扬原创文章,转载请注明出处! 一、项目背景 明德扬(MDY)在2021年承担了多个基于XILINX芯片的研发项目,包括VPX网络透明传输项目(芯片为XC7K325T-2FBG900)、某高端测试仪项目(芯片为XCKU060-FFVA1156)、某网闸设备项目(芯片为XC7Z030-FBG676)等,另外,明德扬自研了基于XC7K325T-2FBG900和基于XC7K410T-2FBG900芯片的核心板,在XILINX研发领域拥有丰富的经验。即使拥有丰富经验和积累,每个新项目我们均...

6034

linux系统编程——信号量相关函数的使用

一、Posix有名信号灯 1.posix有名信号灯函数    函数sem_open创建一个新的有名信号灯或打开一个已存在的有名信号灯。有名信号灯总是既可用于线程间的同步,又能用于进程间的同步。 1. sem_open 名称:: sem_open 功能: 创建并初始化有名信号灯 头文件: #include 函数原形: sem_t *sem_open(const c

felicitia的专栏 3799

【运动规划算法项目实战】Artificial Potential Field算法(附ROS C++代码)

在机器人行业中,路径规划是一个关键的任务,它涉及到如何让机器人在复杂的环境中安全而高效地移动。人工势场算法(Artificial Potential Field Algorithm)是一种常用的路径规划方法,它借鉴了物理学中的势能概念,通过模拟力的作用来引导机器人的移动。本文将详细介绍人工势场算法的原理、在路径规划中的应用、算法优缺点以及代码实现。人工势场算法基于两种势场:斥力场和引力场。斥力场使机器人远离障碍物,而引力场将机器人吸引到目标位置。

xiewf的博客 1万+

9篇3章7节:基于 R 语言的 FAERS 数据提取与合并

本文主要探讨了 FAERS 数据提取与合并的操作流程。首先,通过程序化方法从本地存储的 FAERS ASCII 文件中提取指定季度或范围内的单药报告数据,并可通过参数设置控制数据存储位置、处理方式、计算资源分配以及报告者职业类别等。随后,通过批量读取的方式对多个季度的 DRUG 文件进行循环处理,并将其合并为一个综合数据框。

MD Code 1261

Linux POSIX Semaphore的使用

简而言之,信号量的使用是为了进程同步的用途,避免一个进程访问一个共享内存时候被另一个进程更新。对于POSIX semaphore而言,信号量可以允许进程和线程进行同步,而访问共享的资源。

顺其自然~专栏 980

什么是 SAP ABAP AMDP?

SAP HANA是SAP开发的一种内存数据库管理系统,它具有出色的性能和处理大规模数据的能力。为了充分利用SAP HANA的性能,SAP引入了AMDP技术,以便将数据库操作推送到数据库服务器执行,从而减少数据传输和处理时间。AMDP方法通常需要输入参数和输出参数。输入参数用于传递数据到SQLScript代码,而输出参数用于接收SQLScript代码的结果数据。ENDMETHOD.ENDCLASS.我们定义了一个输入参数来传递销售订单数据,以及一个输出参数来接收计算结果。ENDMETHOD.

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 905

Linux | Posix信号量(semaphore) | 环形队列实现生产消费模型 | 线程池实现

Linux下Posix信号量讲解,接口使用。使用信号量搭建环形队列的生产消费模型,使用条件变量搭建线程池模型

凡事都是靠练习 877

骑砍Ⅱ霸主MOD开发(16)-FaceKey&BannerKey

摘要:本文介绍了FaceKey人物模型和BannerKey旗帜模型的生成流程。FaceKey通过序列化参数生成人物模型,包括头部(脸部、嘴、睫毛、眼睛)、眉毛、头发、身体和躯干等组件,每个部分通过特定标签和骨骼绑定实现。BannerKey则通过解析参数生成旗帜模型,包括模型、贴图和颜色等元素。两种模型都采用参数化设计和XML配置文件实现模型生成与定制。

骑砍战团&霸主MOD开发 2284

计算机网络基础:揭开网络世界的神秘面纱

计算机网络基础:揭开网络世界的神秘面纱,计算机网络已深度融入现代生活,这篇文章对其基础内容展开全面阐述。开篇介绍计算机网络的定义,说明其由计算机设备、网络设备和传输介质构成。接着从地域范围和拓扑结构两个维度对计算机网络进行分类,并详细讲解 OSI 和 TCP/IP 参考模型,明晰各层功能与联系。随后阐述网络通信协议的定义及常见协议,如 TCP/IP、HTTP 等。最后聚焦网络安全,涵盖定义、重要性以及防火墙、加密技术等常用安全技术。文章旨在帮助读者构建计算机网络基础知识体系,理解其在生活和工作中的应用与价值

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 6万+

进程间通信-信号量

信号量主要用于资源的保护,实现互斥(防止多个进程同时访问临界区)和同步(多个进程按一定顺序执行)。可以用于不同的进程间或一个给定进程内部的不同线程之间进行资源互斥和同步。信号量可以保护一个或多个资源,也叫信号灯(通俗semaphore)。1、posix有名信号灯;2、posix基于内存的信号灯(无名信号灯);信号灯(IPC对象),现在用的是IPC对象。信号量相当于一个全局的整型变量,这个变量只能用于原子操作改变值。

xurongxin2006的博客 529

【unity实战】Cinemachine虚拟相机实战,使用InputSystem+Cinemachine+CharacterController复刻各种主流游戏的相机控制

这里主要是探讨如何使用InputSystem+Cinemachine+CharacterController复刻各种主流游戏的相机控制,我们主要专注Cinemachine实战效果,所以并不会深入讨论Cinemachine和CharacterController比较细节的参数介绍。注意:前面为了测试方便,我还是先用的旧的输入系统代替InputSystem【推荐100个unity插件之10】Unity最全的最详细的Cinemachine(虚拟相机系统)介绍,详细案例讲解,快速上手。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 3746

system V信号量和Posix信号量

一、函数上的区别 信号量有两种实现:传统的System V信号量和新的POSIX信号量。它们所提供的函数很容易被区分:对于所有System V信号量函数,在它们的名字里面没有下划线。例如,应该是semget()而不是sem_get()。然而,所有的的POSIX信号量函数都有一个下划线。下面列出了它们提供的所有函数清单: Systm V ...

weixin_30553837的博客 106

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Linux SystemV ipc 实现 .

目录 [隐藏 ] 1 用户进程间通信 1.1 System V IPC对象管理 1.1.1 System V IPC数据结构 1.1.1.1 (1)IPC对象属性结构 kern_ipc_perm 1.1.1.2 (2)结构ipc_ids 1.1.1.3 (3)结构 ipc_namespace 1.1.2 IPC对RCU的支持 1.

mengyafei43的专栏 1513

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

嵌入式Linux并发程序设计,进程间通信方式,System V IPC,信号灯集,创建/打开semget(),初始化semctl(),P/V操作semop(),sembuf结构体定义

文章目录1,System V IPC - 信号灯2,System V IPC - 信号灯特点3,System V信号灯使用步骤3.1,信号灯创建/打开 semget()3.2,信号灯初始化 semctl()3.2.1,信号灯初始化---示例3.3,信号灯P/V操作 semop()3.3.1,信号灯操作 sembuf结构体定义4,信号灯集/共享内存---示例 1,System V IPC...

m0_37542524的博客 904

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

System V信号量 vs. POSIX信号量:核心区别与选型指南

1.STM32F407——使用systick定时器裸机制作延时函数2.一个检查左右括号是否配对的语法检查器(c语言)3.FAT32和NTFS文件系统的区别4.Linux系统中的目录和文件夹的区别5.ARM开发板——实时获取用户点击触摸屏的LCD坐标信息(阻塞式读取)6.进程间通讯代码实例以及相关函数释义7.Linux C线程读写锁深度解读 | 从原理到实战(附实测数据)8.System V信号量 vs. POSIX信号量:核心区别与选型指南9.

weixin_40973431的博客 63

Linux--信号量(semaphore)

信号量(semaphore)

qq_42425882的博客 2028

进程通信方式优缺点

linux上面的IPC大多都是从UNIX上面继承而来。 最初Unix IPC包括:管道、FIFO、信号。System V IPC包括:System V消息队列、System V信号灯、System V共享内存区。由于Unix版本的多样性,电子电气工程协会(IEEE)开发了一个独立的Unix标准,这个新的ANSI Unix标准被称为计算机环境的可移植性操作系统界面(PSOIX)。现有大部分Unix和流行版本都是遵循POSIX标准的,而Linux从一开始就遵循POSIX标准。Posix IPC包括: Posix

chengcheng1024的博客 408

进程间通信优缺点

linux上面的IPC大多都是从UNIX上面继承而来。 最初Unix IPC包括:管道、FIFO、信号。System V IPC包括:System V消息队列、System V信号灯、System V共享内存区。由于Unix版本的多样性,电子电气工程协会(IEEE)开发了一个独立的Unix标准,这个新的ANSI Unix标准被称为计算机环境的可移植性操作系统界面(PSOIX)。现有大部分Unix和流行版本都是遵循POSIX标准的,而Linux从一开始就遵循POSIX标准。Posix IPC包括: Posix

chengcheng1024的博客 551

嵌入式Linux _ System V IPC进程间通信

一、System V IPC (了解) 1、System V IPC机制概念 System V IPC (系统5的IPC 官方版本中引入的一大类进程间通信机制) IPC 对象包含: 共享内存 、 消息队列和信号灯集; 每个IPC对象有唯一的ID;(在创建是由系统分配的) IPC对象创建后一直存在,直到被显示地删除(或者系统关闭,IPC也会自动释放); 每个IPC对象有一...

qq_41764645的博客 450

Linux内核 之 IPC概述

此图清楚的展现了Linux的IPC机制。 其中,最初Unix IPC包括:管道、FIFO、信号; System V IPC包括:System V消息队列、System V信号灯、System V共享内存区; Posix IPC包括: Posix消息队列、Posix信号灯、Posix共享内存区。 Posix为:由于Unix版本的多样性,电子电气工程协会(IEEE)开发了一个独立的Unix...

HeroIsUseless的博客 889

进程间的通信--IPC(消息队列,共享内存)

本文系统介绍了Linux系统中的进程间通信(IPC)机制,重点分析了管道、信号、消息队列和共享内存四种方式。管道适用于单向数据流传输但存在局限性;信号用于异步事件通知但信息量有限;消息队列提供有序消息传递,支持类型过滤;共享内存实现零拷贝数据交换,速度最快但需自行处理同步。文章详细阐述了SystemV IPC中消息队列和共享内存的核心数据结构、关键函数及使用流程,并对比了二者的性能特点和适用场景,为开发者选择合适的IPC机制提供了实践指导。

XINGXIN 197

进程间通信 [ 补充 ]

信号量主要用于同步和互斥的!信号量其实很重要,但是system V版本的信号量并不重要,关于信号量,在后面的多线程专题会着重理解!我们这里先引入一些并发编程的概念铺垫。

Small_entreprene的博客 1191

POSIX信号量

信号量概念 信号量(semaphore)是一种用于提供不同进程间或一个给定进程的不同线程间同步手段的原语。POSIX 有如下类型的信号量: Posix 有名信号量:使用 Posix IPC 名字标识,可用于进程或线程间的同步。 Posix 基于内存的信号量(无名信号量):存放在共享内存区中,可用于进程或线程间的同步。 暂时只考虑不同进程间的同步。首先考虑二值信号量:其值或为 0 或为 1 的信号量。如下图: 该信号量是由内核来维护的(这对于 SystemV 信号量是正确的),其值可以是0或1。 Posix

code_peak 2412

同步(二)Posix信号量

一 Posix信号量: (1)信号量(semaphore):是一种用于提供不同进程间或一个给定进程的不同线程间同步手段的原语。 *二值信号量:其值或为0或为1的信号量。可用于互斥,像互斥锁一样,但互斥锁必须总是由锁住它的线程解锁,信号量的释放(post)却不必由执行过它的等待操作的同一个线程执行。 *计数信号量:通常初始化为某个值N,指示可用的资源数(比如缓冲区)。 (2)Posi

linux系统、网络编程和分布式计算 1449
上一篇: Linux虚拟地址空间布局以及进程栈和线程栈总结
下一篇: C++对象模型和虚函数表分析以及重载、重写、隐藏的区别
FreeeLinux
博客等级 码龄11年 421粉丝 356原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值