首页 > 其他分享 >经典同步问题及其伪代码实现

经典同步问题及其伪代码实现

时间:2024-02-29 13:13:40浏览次数:29  
标签:同步 定义 代码 互斥 while mutex 经典 缓冲区 numReaders

1、生产者消费者问题

信号量版本:

// 定义缓冲区大小
bufferSize = 10
// 定义互斥锁和信号量
mutex = Semaphore(1)
full = Semaphore(0)
empty = Semaphore(bufferSize)

// 定义生产者函数
def producer():
    while true:
        // 生成数据
        data = generateData()
        
        // 等待缓冲区不满
        empty.P()
        mutex.P()
        // 将数据放入缓冲区
        putDataIntoBuffer(data)
        mutex.V()
        full.V()

// 定义消费者函数
def consumer():
    while true:
        // 等待缓冲区不空
        full.P()
        mutex.P()
        // 从缓冲区取出数据
        data = getDataFromBuffer()
        mutex.V()
        empty.V()
        
        // 处理数据
        processData(data)

条件变量版本:

// 定义缓冲区大小
bufferSize = 10

// 定义互斥锁和条件变量
mutex = Mutex()
notEmpty = Condition(mutex)
notFull = Condition(mutex)

// 定义缓冲区和指针
buffer = []
inIndex = 0
outIndex = 0

// 定义生产者函数
def producer():
    while true:
        // 生成数据
        data = generateData()
        
        // 获取互斥锁
        mutex.lock()
        
        // 等待缓冲区不满
        while buffer.length == bufferSize:
            notFull.wait()
        
        // 将数据放入缓冲区
        buffer[inIndex] = data
        inIndex = (inIndex + 1) % bufferSize
        
        // 通知消费者缓冲区不为空
        notEmpty.signal()
        // 释放互斥锁
        mutex.unlock()

// 定义消费者函数
def consumer():
    while true:
        // 获取互斥锁
        mutex.lock()
        
        // 等待缓冲区不为空
        while buffer.length == 0:
            notEmpty.wait()
        
        // 从缓冲区取出数据
        data = buffer[outIndex]
        outIndex = (outIndex + 1) % bufferSize
        
        // 通知生产者缓冲区不满
        notFull.signal()
        
        // 释放互斥锁
        mutex.unlock()
        
        // 处理数据
        processData(data)

2、读者写者问题

信号量版本

// 定义读者数量和写者数量
numReaders = 0
numWriters = 0

// 定义互斥锁和信号量
mutex = Semaphore(1)
writeLock = Semaphore(1)

// 定义读者函数
def reader():
    while true:
        mutex.P() // 获取互斥锁
            numReaders += 1
            if numReaders == 1: // 如果是第一个读者,获取写者锁
                writeLock.P()
        mutex.V()
        
        readResource()
        
        mutex.P() // 获取互斥锁
            numReaders -= 1 
            if numReaders == 0: // 如果是最后一个读者,释放写者锁
                writeLock.V()
        mutex.V()

// 定义写者函数
def writer():
    while true:
        writeLock.P()
        	write()
        writeLock.V()

条件变量版本

// 定义互斥锁和条件变量
mutex = Mutex()
readersCond = Condition(mutex)
writersCond = Condition(mutex)

// 定义读者函数
def reader():
    while true:
        // 获取互斥锁
        mutex.lock()
            // 等待写者释放资源
            while numWriters > 0:
                readersCond.wait()

            numReaders += 1
            readersCond.signal()
        mutex.unlock()
        
        readResource()
        
        // 获取互斥锁
        mutex.lock()
            numReaders -= 1
            if numReaders == 0:
                writersCond.signal()
        mutex.unlock()

// 定义写者函数
def writer():
    while true:
        mutex.lock()       
            // 等待其他读者和写者释放资源
            while numReaders > 0:
                writersCond.wait()

            // 写入资源
            writeResource()

            // 通知其他读者和写者
            readersCond.signal()
            writersCond.signal()
        mutex.unlock()

3、哲学家就餐问题

可能有死锁的写法:每个哲学家都拿着左边的筷子,永远都在等右边的筷子。至少一个哲学家的获取筷子的顺序要与其他人不同,以打破环路等待条件

def getforks() :
  	if(p == 4):
      	right[p].P
        left[p].P
    else:
      	left[p].P
        right[p].P
   	eat()
    left[p].V
    right[p].V

标签:同步,定义,代码,互斥,while,mutex,经典,缓冲区,numReaders
From: https://www.cnblogs.com/hellozhangjz/p/18043414

相关文章

  • day50 动态规划part7 代码随想录算法训练营 279. 完全平方数
    题目:279.完全平方数我的感悟:看文字也行理解难点:物品是什么?是i*i<n的集合听课笔记:代码示例:classSolution:defnumSquares(self,n:int)->int:#完全背包问题#顺序没关系,组合把#递推公式难想,dp[j]=min(dp[j],dp[j-i*i]+1)......
  • day50 动态规划part7 代码随想录算法训练营 322. 零钱兑换【什么时候+1】
    题目:322.零钱兑换我的感悟:看着文字版也能做出来了,哈哈哈!!理解难点:这题是最小值dp[j]=min(dp[j],dp[j-coins[i]+1)因为是数量要加一个1,有的加,有的不加,还没太搞清楚。 听课笔记: 代码示例:classSolution:defcoinChange(self,coins:List[int],amount:int......
  • Linux_时间同步和开机自启动
    时间同步时间同步可分为几部分的内容:统一时钟源,硬件同步,软件同步。时间同步--时空一体--(时间-空间-物体)1.timespaceobject速度加速度角速度位置距离角度2.GPS卫星GPS基站GPS终端空间--太阳大气层地面空间干扰-环境遮蔽--空间隔......
  • 实战上,通过一段ID 生成器代码,学习如何发现,代码质量的问题(设计模式)
    ID生成器的需求背景介绍ID中文翻译为标识Identifier,这个概念在生活,工作中随处可见,比如身份证、商业条形码、二维码、车牌号、驾照号。聚焦到软件开发中,ID常用来标识一些业务信息的唯一标识,比如订单的单号或者数据库中的唯一主键,比如地址中ID字段(实际上时没有业务含义的,对用......
  • 用ChatGPT试了一下,果然好用,生成的CRC的代码
    CEIWEI之前发布过一款Hash/CRC工具,支持从CRC3到CRC64的全部CRC类型功能小工具。因为是免费获取,不少小伙伴们加我微信,要注册码,着实有点忙,没有时间回复各位,抱歉!这几天,用ChatGPT试了一下,果然好用,生成的CRC的代码,稍加修改,直接可用。废话少说,上图!DelphiXE7代码:以上代码是ChatG......
  • day44 动态规划part7 代码随想录算法训练营 70. 爬楼梯 (进阶)
    题目:爬楼梯(进阶)-在卡尔网我的感悟:昨天最后没怎么听懂的,今日回旋镖来了。理解难点:递推公式,和遍历顺序手写笔记:代码示例:total,m=map(int,input().split())#每次爬m个#dp[i]含义是爬到i有dp[i]种方法#是完全背包问题dp=[0]*(total+1)dp[0]=1fo......
  • 快速改善代码质量的20 条编程规范
    命名大到项目名,模块名,包名,对外暴露的接口,笑道类名,函数名,变量名,参数名。只要做开发,我们就逃不过起名字这一关,命名的好坏,对于代码的可读性来说非常中国要。甚至起到决定性的作用。除此之外,命名能力也体现了一个程序员的而基本的素养。这也是我们把命名放到第一位的原因。 取一个......
  • 二月一日梦断代码读后感3
    《梦断代码》通过主人公与人工智能之间的互动,揭示了人类情感、自我意识和道德观念在科技时代的重要性。小说中的情节展现了人工智能可能具有的智慧与情感,引发了无数思考和争议。通过主人公与梦境之间的对话,读者不仅感受到了科技发展带来的可能性和便利性,也开始思考科技对人类生活......
  • 一月三十一日,梦断代码读后感2
    在《梦断代码》中,作者运用了夸张的科幻元素和复杂的人际关系,将人工智能与人类之间的互动呈现得深刻而生动。通过主人公与梦境之间的对话和互动,读者不仅能感受到人工智能的冷静和理性,还能深入思考人类情感和意识的本质。小说中探讨了人工智能可能具有的情感和自我意识,以及人类面临......
  • 2.3 梦断代码读后感
    《梦断代码》是一部探讨人工智能和人类情感关系的科幻小说,通过描述主人公与一台具有自我意识的人工智能机器之间的互动,揭示了人类与机器之间可能出现的情感纠葛和道德困境。小说引人深思的地方在于,当人工智能具备类似人类情感和思考能力时,人们该如何与之相处、如何看待它们的权利......