首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏CSDN搜“看,未来”

    信号量--System V信号量 与 Posix信号量

    信号量是什么 信号量是一种计数器,用来控制对多个进程/线程共享的资源进行访问。常和锁一同使用。 在某个进程/线程正在对某个资源进行访问时,信号量可以阻止另一个进程/线程去打扰。 2、从使用的角度,System V 信号量的使用比较复杂,而 POSIX 信号量使用起来相对简单。 3、对 POSIX 来说,信号量是个非负整数。 而 System V 信号量则是一个或多个信号量的集合,它对应的是一个信号量结构体,这个结构体是为 System V IPC 服务的,信号量只不过是它的一部分。 short sem_op; //信号量的操作 {正负零} short sem_flg; //信号量的操作标志 {NOWAIT} }; //sem_op取0表示将信号量设为睡眠状态,直到信号量的值为 V操作:进行减少一个信号量的值的操作 Posix P:sem_post(sem_t *sem); V:sem_wait(sem_t *sem); 3、控制信号量参数 System V Posix

    2.1K10发布于 2020-08-26
  • 信号量

    利用信号量机制实现两个任务进程共享单缓冲区的同步算法。 信号量是一种用于实现进程间同步和互斥的机制,可以通过信号量来解决进程间对共享资源的访问冲突问题。 在这个问题中,我们可以使用两个信号量来实现采集任务和计算任务之间对单缓冲区的同步。 首先定义两个信号量: sem_empty: 表示单缓冲区是否为空的信号量,初值为1。 sem_full: 表示单缓冲区是否已满的信号量,初值为0。 P(sem_full) // 从缓冲区取出数据 // 进行计算 // 通知采集任务 V(sem_empty) 这样,采集任务进程和计算任务进程就可以通过信号量机制实现对单缓冲区的同步

    14810编辑于 2025-08-29
  • 来自专栏只喝牛奶的杀手

    信号量

    Hystrix内部提供了两种模式执行逻辑:信号量和线程池。默认情况下,Hystrix使用线程池模式。那什么是信号量呢? 维基百科的定义: 信号量(英语:semaphore)又称为信号标,是一个同步对象,用于保持在0至指定最大值之间的一个计数值。 信号量作用控制同时访问的线程个数。 Semaphore 翻译成字面意思为信号量, Semaphore 可以控制同时访问的线程个数, 通过acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可。

    82340发布于 2019-08-26
  • 来自专栏乐行僧的博客

    信号量

    ) 参数: sem:指定是哪一个信号量 pshared:指定信号量的类型,值为0表示是在当前进程使用的局部信号量,否则该信号量就可以在多个进程中共享。 value:指定信号量的初始值,可以理解为最多由多少个线程可以访问共享资源。 返回值: 2.销毁信号量 函数原型:int sem_destroy(sem_t* sem) 函数功能:释放信号量占用的内核资源,注意不能释放正在被线程其他等待的信号量,否则会出现错误。 返回值: 3.加锁 函数原型:int sem_wait(sem_t* sem) 函数功能:对信号量的值value进行-1操作,相当于p操作。如果value的值为0,会发生阻塞。 当信号量的值value大于0时,其他调用sem_wait()正在等待信号量的线程将被唤醒。

    67350编辑于 2022-02-25
  • 来自专栏全栈程序员必看

    临界区 互斥量 事件 信号量_互斥信号量与同步信号量

    3信号量:为控制一个具有有限数量用户资源而设计。 4、事 件:用来通知线程有一些事件已发生,从而启动后继任务的开始。 P操作 申请资源:   (1)S减1;   (2)若S减1后仍大于等于零,则进程继续执行;   (3)若S减1后小于零,则该进程被阻塞后进入与该信号相对应的队列中,然后转入进程调度。 V操作 释放资源:   (1)S加1;   (2)若相加结果大于零,则进程继续执行;   (3)若相加结果小于等于零,则从该信号的等待队列中唤醒一个等待进程,然后再返回原进程继续执行或转入进程调度 信号量包含的几个操作原语:   CreateSemaphore() 创建一个信号量   OpenSemaphore() 打开一个信号量   ReleaseSemaphore() 释放信号量    3

    1.3K10编辑于 2022-09-23
  • 来自专栏orientlu

    FreeRTOS 信号量

    使用信号量需要在源文件中包含头文件 semphr.h , 该文件定义了信号量的 API, 实际我们使用的信号量 API 都是宏定义, 宏的实际是队列提供的函数。 FreeRTOS 信号量包括二进制信号量、计数信号量、互斥锁和递归互斥锁。 这篇文章介绍如何使用这些信号量就行任务间同步以及其实现。 , 该值变为1(最大也只能为1),此时信号量有效, 如果有任务获取消费了信号量,该变量再次变为0, 信号量无效, 有任务在次调用获取信号量,可能阻塞等待或者返回信号量空。 计数信号量 二进制信号量是长度为1的队列, 计数信号量则是长度可以大于1的信号量, 当设置长度为1, 其行为和二进制型号量一样。 当任务调用 API 释放信号量信号量未读计数加1, 任务调用接收函数处理信号量, 则对应减1,初始化信号量计数为0。 所以, 使用上, 计数信号量和二进制信号量是差不多。

    2.7K22发布于 2018-09-13
  • 来自专栏阿飞的学习记录

    Semaphore信号量

    Semaphore信号量 Semaphore是用来保护一个或者多个共享资源的访问,Semaphore内部维护了一个计数器,其值为可以访问的共享资源的个数。 一个线程要访问共享资源,先获得信号量,如果信号量的计数器值大于1,意味着有共享资源可以访问,则使其计数器值减去1,再访问共享资源。 如果计数器值为0,线程进入休眠。 当某个线程使用完共享资源后,释放信号量,并将信号量内部的计数器加1,之前进入休眠的线程将被唤醒并再次试图获得信号量。 例如:停车场的车位 ,有空闲车位才可以停,没有空闲车位只能等待。 主要使用方法: acquire() 从信号量获取一个许可,在提供一个许可之前一直将线程阻塞 否则线程被中断 release() 释放一个许可,将其返回给信号量 例子: 停车场有五个停车位 有十辆车要停

    46110编辑于 2022-03-23
  • 来自专栏happyJared

    Semaphore - 信号量

    synchronized 和 ReentrantLock 都是一次只允许一个线程访问某个资源,Semaphore 还可以指定多个线程同时访问某个资源。

    51730发布于 2019-07-22
  • 来自专栏王大锤

    iOS 信号量

    2、信号量主要有3个函数,分别是: //创建信号量,参数:信号量的初值,如果小于0则会返回NULL dispatch_semaphore_create(信号量值) //等待降低信号量 dispatch_semaphore_wait 3、先来一个简单的例子 // 创建信号量,并且设置值为10 dispatch_semaphore_t semaphore = dispatch_semaphore_create(10); 3、是不是有点感觉了,那再来一个例子,就更清楚了 -(void)dispatchSignal{ //crate的value表示,最多几个资源可访问 dispatch_semaphore_t 如果设定信号值=3 dispatch_semaphore_t semaphore = dispatch_semaphore_create(3); 那么结果就是:  ? 其实设定为3,就是不限制线程执行了,因为一共才只有3个线程。 参考资料: 浅谈GCD中的信号量 iOS GCD中级篇 - dispatch_semaphore(信号量)的理解及使用

    1.4K90发布于 2018-05-17
  • 来自专栏编程语言的世界

    php信号量

    php//获得信号量的方法$execute = function () {    //(1).创建IPC通信KEY    $key = ftok(__FILE__, 'a');    //(2).获取一个信号量资源句柄 '获得信号量' .  '未获得信号量' .  PHP_EOL;};//(3).模拟父子进程抢占信号$pid = pcntl_fork();if ($pid == -1) {    throw new Exception('创建子进程失败');} elseif 1个进程可以获取信号量,所以实现了锁的效果//2.配合sem_acquire函数的no_wait参数实现阻塞或者非阻塞//3.整体的效果和文件锁完全一样,但是比文件锁性能更好

    39920编辑于 2023-06-03
  • 来自专栏乐行僧的博客

    信号量原理

    信号量信号量是基于软件互斥或硬件互斥方法实现的一种用于同步和互斥的机制。信号量只有两种操作原语:wait, signal 一.整型信号量 整型信号量用于描述临界资源的个数。 s=10; 表示一个初始资源数量为10的信号量 wait(s) { while (s <= 0); s --; } signal(s) { s ++; } 缺点:违背“让权等待”的同步原则,由于当信号量所表示的资源数目 二.记录型信号量 为了解决整型信号量中在wait原语中违背“让权等待”的原则的问题,记录型信号量提出新的想法,设置一个阻塞队列,当s.value<=0时,便将改成挂到阻塞队列队尾,以免造成对cpu时间的浪费 记录型信号量是一个结构题,包含对临界资源数量的描述以及阻塞队列。 : 当用于同步时,信号量的初始值设置为0。

    77710编辑于 2022-02-25
  • 来自专栏Linux内核深入分析

    信号量(semaphore)

    信号量 信号量也是一种锁,相对于自旋锁,当资源不可用的时候,它会使进程挂起,进入睡眠。而自旋锁则是让等待者忙等。 这意味着在使用自旋锁获得某一信号量的进程会出现对处理器拥有权的丧失,也即时进程切换出处理器。信号量一般用于进程上下文,自旋锁一般用于中断上下文。 wait_list: 用于管理所有在获取该信号量时候进入睡眠的进程,将这些进程加入到wait_list中。 从上述的信号量定义处看见注释: 不要直接的访问信号量的任何成员。 DOWN操作 信号量上的DOWN操作,是用来获取信号量。 使用信号量实现互斥 当信号量的count=1的时候,这种情况下就可以实现互斥机制。

    1.1K10发布于 2020-03-24
  • 来自专栏架构师高级俱乐部

    Semaphore 信号量

    例如,如果我们设置最大计数为 3,初始计数为 0。这意味着 3 个线程已经在临界区。 如果我们将最大计数设置为 3,初始计数设置为 3,则意味着最多可以有 3 个线程进入临界区,并且临界区中当前没有线程. 在多个进程之间使用信号量 或者 semaphore 有另一个构造函数,它接受额外的字符串作为参数。该字符串参数是一个唯一的字符串,用于在多个进程之间使用信号量 以下是创建信号量的用法。 semaphoreObject.Release(3); 在上面的代码中,我们将 3 传递给 Release 方法。这将通知信号量对象实际上有 3 个线程从临界区退出。所以信号量对象将计数器增加 3。 Semaphore 示例 在下面的示例中显示了如何将信号量对象与Console一起使用。要求限制可以同时使用 Printer 对象的线程数。为此,我们使用最大计数为 3信号量对象。

    76310编辑于 2022-04-27
  • 来自专栏计算机工具

    信号量机制

    什么是信号量信号量(semaphore)的数据结构为一个值和一个指针,指针指向等待该信号量的下一个进程。信号量的值与相应资源的使用情况有关。 注意,信号量的值仅能由PV操作来改变。 一般来说,信号量S³0时,S表示可用资源的数量。 (3)互斥信号量的初值一般为1。 3.三个经典同步问题 前面我们讲到信号量机制,下面我们讲解利用信号量及PV操作解决几个经典同步问题。 原理:规定奇数号的哲学家先拿起他左边的筷子,然后再去拿他右边的筷子;而偶数号 的哲学家则相反.按此规定,将是1,2号哲学家竞争1号筷子,3,4号哲学家竞争3号筷子.即 五个哲学家都竞争奇数号筷子,获得后 ); } 消费者进程 while(TRUE){ P(full);   从buffer(out)中取出产品;   out=(out+1)mod n;   V(empty);   消费该产品;   } (3

    78610编辑于 2024-12-16
  • 来自专栏兮动人的博客

    信号量机制

    信号量机制 2. 信号量机制――整型信号量 3. 信号量机制――记录型信号量 知识回顾与重要考点 知识总览 1. 信号量机制 2. 信号量机制――整型信号量 3. 信号量机制――记录型信号量 知识回顾与重要考点

    1.2K10发布于 2021-06-11
  • 来自专栏落叶飞翔的蜗牛

    理解Semaphore信号量

    synchronized 和 ReentrantLock 都是一次只允许一个线程访问某个资源,Semaphore(信号量)可以指定多个线程同时访问某个资源。 下图所示为一个允许3个线程同时打饭的信号量场景,除了这三个线程以外的线程,将会在队列中阻塞。 ?

    49820发布于 2021-04-08
  • 来自专栏嵌入式Linux系统开发

    FreeRTOS(十三):信号量

    信号量是操作系统中重要的一部分,信号量一般用来进行资源管理和任务同步,FreeRTOS 中信号量又分为二值信号量、计数型信号量、互斥信号量和递归互斥信号量。 四种信号量详细介绍 1、二值信号量 二值信号量通常用于互斥访问或同步,二值信号量和互斥信号量非常类似,但是还是有一些细微的差别,互斥信号量拥有优先级继承机制,二值信号量没有优先级继承。 创建二值信号量 释放信号量 获取信号量 2、计数型信号量 有些资料中也将计数型信号量叫做数值信号量,二值信号量相当于长度为 1 的队列,那么计数型信号量就是长度大于 1 的队列。 (2) 某一时刻任务 L 想要访问共享资源,在此之前它必须先获得对应该资源的信号量。 (3) 任务 L 获得信号量并开始使用该共享资源。 这就要引出另外一种信号量——互斥信号量3、互斥信号量 互斥信号量其实就是一个拥有优先级继承的二值信号量,在同步的应用中(任务与任务或中断与任务之间的同步)二值信号量最适合。

    1.6K41编辑于 2022-02-17
  • 来自专栏嵌入式艺术

    【源码分析】——信号量

    1、信号量介绍 信号量(Semaphore)是操作系统中最典型的用于同步和互斥的手段,信号量的值可以是0、1或者n。信号量与操作系统中的经典概念PV操作对应。 V(Vaporize): 将信号量S的值加1,即S=S+1; 如果S>0,唤醒队列中等待信号量的进程。 信号量也可以用于同步,一个进程A执行down()等待信号量,另外一个进程B执行up()释放信号量,这样进程A就同步地等待了进程B。 3、API实现 3.1 semaphore struct semaphore { raw_spinlock_t lock; unsigned int count; struct ,如果信号量的值大于0,则消耗一个;如果不存在,则让线程进入休眠状态并等待信号量被释放。

    1.3K31编辑于 2023-09-28
  • 来自专栏机器和智能

    【线程同步】信号量

    信号量的初值决定了占用信号量的线程的个数。 信号量大于0,则信号量--,信号量等于0,则线程阻塞。 value of the semaphore is left unchanged, -1 is returned, and errno is set to indicate the error. 3. pthread_self(), gdata); vector[(i++)%MAX] = gdata++; sem_post(&ful); sleep(rand()%3) __FUNCTION__,\ pthread_self(), num); sem_post(&blank); sleep(rand()%3)

    62010编辑于 2024-08-08
  • 来自专栏嵌入式程序猿

    freeRTOS信号量学习

    信号量同样是RTOS学习中很重要的一节,信号量可以用在共享资源或者同步任务中,对执行权的控制,谁拥有信号量谁拥有执行权,在freeRTOS中信号量和互斥量有点不同,关于信号量的更多描述可以参考官网相关网页描述 每一个信号量都需要少量的内存来保持信号量的状态,那么这内存是如何分配的呢,这根据使用的API函数会有所不同,创建信号量主要有xSemaphoreCreateBinary()和xSemaphoreCreateBinaryStatic () ,使用前者创建信号量,则所需的内存将会自动从freeRTOS的堆上分配,如果是使用后者创建的信号量,则所需内存由应用程序分配,且后者API需要另外的参数,在编译的时候静态分配给信号量,前者则是动态分配 我们看一下两种API创建信号量使用的例子 Example usage: SemaphoreHandle_txSemaphore; void vATask( void *pvParameters ) { configASSERT( xSemaphore ); /* Rest of the task code goes here. */ } 在公众号前面的文章中我们在kv46上移植的demo有官方提供的信号量的例程

    1.4K50发布于 2018-04-10
领券