二进制信号量来实现计数信号量
一、二进制信号量
struct binary_semaphore { enum(zero, one) value; queueType queue; }
void waitB(binary_semaphore s) { if (s.value == 1) s.value = 0; else//为0阻塞 { place this process in s.queue; block this process; } }
void signalB(binary_semaphore s) { if (s.queue.is_empty()) {//If there are no processes waiting for the semaphore s.value = 1; } else//队列非空,解除一个阻塞 { remove a process P from s.queue; place process P on ready list; } }
二、计数信号量
struct semaphore { int count; queueType queue;//阻塞队列 }
主要是对count的理解,(注意:在++,--之前)
当count>0时表示还有count个资源可用,
当count<0时表示有count个进程正在等待资源
count==0时,wait会阻塞,0个资源可用
count==0时,signal直接通过,0个进程等待
void wait(semaphore s) { s.count--; if (s.count < 0)//阻塞 { place this process in s.queue; block this process; } }
void signal(semaphore s) { s.count++; if (s.count <= 0)//解除一个阻塞 { remove a process P from s.queue; place process P on ready list; } }
三、二进制信号量来实现计数信号量
(一)冗长版
struct binary_semaphore { enum(zero, one) value; queueType queue; } //开始时:s1=1,s2=0,整数count的值设置为计数信号量s的初值。 binary_semaphore s1 = 1; binary_semaphore s2 = 0; int count =//计数信号量s的初值; void wait()//看资源,count>=0表示还有count个资源可以分配。 { waitB(s1); if (count <= 0) {//count==0表示没有资源了,负的也是表示没有资源 count--; signalB(s1);//释放锁,其他可以对count进行操作 waitB(s2); signalB(s1); } else {//还有资源 count--; signalB(s1); } } void signal()//看阻塞线程,count<=0表示还有count个进程正在等待。 { waitB(s1); if (count < 0) {//当count<0时表示有count个进程正在等待资源 count++; signalB(s2);//后面执行wait()中waitB(s2)后的signalB(s1)。写到waitB(s2)后,感觉原子性更强 } else {//count==0表示没有进程等待,正的也是没有进程等待 count++; signalB(s1); } }
(二)精简版
//开始时:s1=1,s2=0,整数count的值设置为计数信号量s的初值。 binary_semaphore s1 = 1; binary_semaphore s2 = 0; int count =//计数信号量s的初值; void wait()//看资源 { waitB(s1); count--; if (count < 0) { signalB(s1);//释放锁,其他可以对count进行操作 waitB(s2);//阻塞 } signalB(s1); } void signal()//看阻塞线程 { waitB(s1); count++; if (count <= 0) { signalB(s2);//后面执行wait()中最后的signalB(s1) } else { signalB(s1); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了