关于线程释放资源以后信号量的变化的问题

问题描述

关于线程释放资源以后信号量的变化的问题

线程访问资源时首先获取信号量

将信号量的值减一

如果信号量的值小于0,则进入等待状态,否则继续执行。

访问完资源以后,线程释放信号量,进行如下操作:

将信号量的值加一

如果信号量的值小于1,唤醒一个等待中的线程。

我就很奇怪最后一句,怎么会是唤醒一个等待中的线程?信号量的值都已经小于1了,这说明已经没有信号量了,那为啥还要唤醒信号量呢?

解决方案

信号量小于1,但是如果等于0,就表示现在可以让一个线程进入访问资源, 所以就唤醒一个等待线程

解决方案二:

线程可以访问资源,那应该是信号量大于0才对,如果一个线程试图访问资源,信号量减一后变成了小于0不就必须要等待了吗?
显然你没有回答准确。

时间: 2024-10-29 21:17:58

关于线程释放资源以后信号量的变化的问题的相关文章

线程同步--使用信号量

除了使用临界区与互斥可以完成线程间的同步外,还可以使用信号量CSemaphore.使用信号量还有一个好处便是:信号允许多个线程同时使用共享资源,这便与操作系统中的PV操作有些雷同的地方.它指出了同时访问共享资源的线程最大数目. 在信号量内部有一个计数器,当有线程访问共享资源时,计数器将自动递减,当它为0时,不再允许其他线程对共享资源的访问,直到有一个线程释放共享资源,从而完成对共享资源的保护. 在建立一个信号量时必须提供一个初始化值和一个最大计数值,如: CSemaphore Semaphore

4线程同步:信号量

1信号量 信号量可以有n把锁. 依赖的头文件 #include <semaphore.h> 函数声明 sem_t表示信号量   int sem_init(sem_t *sem, int pshared,unsigned int value); 名称: sem_init 功能: initialize an unnamed semaphore,初始化信号量sem_t,初始化的时候可以指定信号量的初始值,以及是否可以在多进程间共享. 头文件: #include <semaphore.h>

基于Boost的数据处理器及线程安全类和信号量

http://download.csdn.net/download/great3779/3998262

用GCD线程组与GCD信号量将异步线程转换为同步线程

有时候我们会碰到这样子的一种情形: 同时获取两个网络请求的数据,但是网络请求是异步的,我们需要获取到两个网络请求的数据之后才能够进行下一步的操作,这个时候,就是线程组与信号量的用武之地了. #import "ViewController.h" #import <AFNetworking.h> @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [supe

进程间通信之-信号量semaphore--linux内核剖析(十)

信号量 什么是信号量 信号量的使用主要是用来保护共享资源,使得资源在一个时刻只有一个进程(线程)所拥有. 信号量的值为正的时候,说明它空闲.所测试的线程可以锁定而使用它.若为0,说明它被占用,测试的线程要进入睡眠队列中,等待被唤醒. 为了防止出现因多个程序同时访问一个共享资源而引发的一系列问题,我们需要一种方法,它可以通过生成并使用令牌来授权,在任一时刻只能有一个执行线程访问代码的临界区域. 临界区域是指执行数据更新的代码需要独占式地执行.而信号量就可以提供这样的一种访问机制,让一个临界区同一时

C#并行编程-线程同步原语

原文:C#并行编程-线程同步原语 菜鸟学习并行编程,参考<C#并行编程高级教程.PDF>,如有错误,欢迎指正. 背景 有时候必须访问变量.实例.方法.属性或者结构体,而这些并没有准备好用于并发访问,或者有时候需要执行部分代码,而这些代码必须单独运行,这是不得不通过将任务分解的方式让它们独立运行. 当任务和线程要访问共享的数据和资源的时候,您必须添加显示的同步,或者使用原子操作或锁. 之前的.NET Framework提供了昂贵的锁机制以及遗留的多线程模型,新的数据结构允许细粒度的并发和并行化,

GCD之信号量机制一

在使用NSOperationQueue进行多线程编程时,可通过[queue setMaxConcurrentOperationCount:5]来设置线程池中最多并行的线程数,在GCD中信号量机制也和它相似,可以控制并发的线程数量. 1.首先熟悉下几个函数 dispatch_semaphore_create 创建一个信号量,设置一个初始值 dispatch_semaphore_signal 发送一个信号,信号通知,信号量+1 dispatch_semaphore_wait 等待信号,信号量-1 当

Windows 8 Store Apps学习(47) 多线程之线程同步: Semaphore等

多线程之线程同步: Semaphore, CountdownEvent, Barrier, ManualResetEvent, AutoResetEvent 介绍 重新想象 Windows 8 Store Apps 之 线程同步 Semaphore - 信号量 CountdownEvent - 通过信号数量实现线程同步 Barrier - 屏障 ManualResetEvent - 手动红绿灯 AutoResetEvent - 自动红绿灯 示例 1.演示 Semaphore 的使用 Thread

java的线程组

所有线程都隶属于一个线程组.那可以是一个默认线程组,亦可是一个创建线程时明确指定的组.在创建之初,线程被限制到一个组里,而且不能改变到一个不同的组.每个应用都至少有一个线程从属于系统线程组.若创建多个线程而不指定一个组,它们就会自动归属于系统线程组. 线程组也必须从属于其他线程组.必须在构建器里指定新线程组从属于哪个线程组.若在创建一个线程组的时候没有指定它的归属,则同样会自动成为系统线程组的一名属下.因此,一个应用程序中的所有线程组最终都会将系统线程组作为自己的"父". 之所以要提出