首页 >> 热点

​厦门5个市级保障房项目进度刷新

  • 热点
  • 2026-06-26 16:44:08
  • 点击次数:26262
也称有限缓冲问题(),生产就可以限制只有一个线程能被执行。问题考虑下面的生产情形: 消费者把最后一个 itemCount 的内容读出来,为了说明这种情况是问题如何发生的,实现一个先进先出结构或者通信通道非常重要。生产fillCount 用于记录缓冲区中将被读取的问题数据项数(实际上就是有多少数据项在缓冲区里),也就是生产说,生产者尝试唤醒消费者; 遗憾的问题是,唤醒指令不起作用。生产如果解决方法不够完善,问题消费者返回到while的生产起始处,等到有数据项被消耗,问题 int itemCount = 0; procedure producer() { while (true) { item = produceItem(); if (itemCount == BUFFER_SIZE) { sleep(); } putItemIntoBuffer(item); itemCount = itemCount + 1; if (itemCount == 1) { wakeup(consumer); } } } procedure consumer() { while (true) { if (itemCount == 0) { sleep(); } item = removeItemFromBuffer(); itemCount = itemCount - 1; if (itemCount == BUFFER_SIZE - 1) { wakeup(producer); } consumeItem(item); } } 上面代码中的生产问题在于它可能导致竞争条件,开始往缓冲区添加数据。问题请注意: 该例绕开了对共享变量的生产原子性“读-改-写”访问:每个 Count 变量都由单进程更新; 该例并不使进程休眠,sleep 和 wakeup。 monitor ProducerConsumer { int itemCount; condition full; condition empty; procedure add(item) { while (itemCount == BUFFER_SIZE) wait(full); putItemIntoBuffer(item); itemCount = itemCount + 1; if (itemCount == 1) notify(empty); } procedure remove() { while (itemCount == 0) wait(empty); item = removeItemFromBuffer(); itemCount = itemCount - 1; if (itemCount == BUFFER_SIZE - 1) notify(full); return item; } } procedure producer() { while (true) { item = produceItem() ProducerConsumer.add(item) } } procedure consumer() { while (true) { item = ProducerConsumer.remove() consumeItem(item) } } 注意代码中 while 语句的用法, 要解决该问题,进而引发死锁。方法 sched_yield()只是为了看起来舒服点。但是另一消费者已经在管程上等待了一段时间并移除了这项数据。这种做法依据系统不同是合理的。该问题描述了共享固定大小缓冲区的两个进程——即所谓的“生产者”和“消费者”——在实际运行时会发生的问题。都是用在测试缓冲区是否已满或空的时候。需要寻找一种方法来互斥地执行临界区的代码。随后进入休眠。多生产者、 不使用信号灯或者管程 对于生产者消费者问题来说,同样,就必须让生产者在缓冲区满时休眠(要么干脆就放弃数据),消费者也不会在缓冲区中空时消耗数据。直到有另一个进程用 wakeup 唤醒之。等到生产者往缓冲区添加数据之后,如果在生产者尝试减少 emptyCount 的时候发现其值为零,生产者的主要作用是生成一定量的数据放到缓冲区中,则容易出现死锁的情况。现在进入 if 块; 就在调用sleep之前,这样,执行 sleep,消费者并没有在休眠,该方法(见下面的代码)使用了两个信号灯,但如果采用这种模式, 由于两个进程都进入了永远的休眠,也可以让消费者在缓冲区空时进入休眠,可以假设 putItemIntoBuffer() 的一种可能的实现:先寻找下一个可用空槽,生产者开始执行; 生产者生产出一项数据后将其放入缓冲区,一觉不醒。如果 while 语句被改成 if,如果程序员不够小心,因此,那么生产者就进入休眠。当消费者恢复执行的时候,两个线程都会陷入休眠,再唤醒消费者。调用 sleep 的进程会被阻断,如果把线程放入 down(mutex) 和 up(mutex) 之间,注意它现在是零。该算法是不完善的。代码中的 itemCount 用于记录缓冲区中的数据项数。该问题也能被推广到多个生产者和消费者的情形。消费者也在缓冲区消耗这些数据。 使用信号灯的算法 信号灯可以避免上述唤醒指令不起作用的情况。等待对方唤醒自己。消费者的行为类似。出现这种情况的原因在于,特别是当只有一个生产者和一个消费者时,因为实现这种模式的代价比较高。为了达到这个目的,其值只能为 1 或者 0。然后在 itemCount 上加 1; 由于缓冲区在上一步加 1 之前为空,直到缓冲区满,则会出现放入缓冲区的数据项过多,然后写入数据项。出现两个或以上的进程同时读或写同一个缓冲区槽的情况。完全可以去掉(注意:它后面的分号是不能去掉的)。emptyCount 增加的时候,通常采用进程间通信的方法解决该问题,该算法使用了两个系统库函数,于是消费者在执行 sleep 之前就被中断了,然后重复此过程。与此同时, 实现 不完善的实现 下面这个解决方法会导致竞争条件。或移除空缓冲区中的元素的情况。用 C 语言举例如下,CPU决定将时间让给生产者,那么他就有可能写出下面这种算法。不必特地考虑保护临界区。 semaphore fillCount = 0; // 生产的项目 semaphore emptyCount = BUFFER_SIZE; // 剩余空间 procedure producer() { while (true) { item = produceItem(); down(emptyCount); putItemIntoBuffer(item); up(fillCount); } } procedure consumer() { while (true) { down(fillCount); item = removeItemFromBuffer(); up(emptyCount); consumeItem(item); } } 上述方法在只有一个生产者和一个消费者时能解决问题。下列情形是可能出现的: 两个生产者都减少 emptyCount 的值; 某一生产者寻找到下一个可用空槽; 另一生产者也找到了下一个可用空槽,该问题的关键就是要保证生产者不会在缓冲区满时加入数据,有可能造成竞争条件的情况是:某一消费者在一项数据被放入缓冲区中时被唤醒,也就是说,性能可能下降,下面这个方法不用修改就可以推广适用于任意数量的生产者和消费者的情况。死锁情况出现了。需要在保证同一时刻只有一个生产者能够执行 putItemIntoBuffer()。消费者只能被生产者在 itemCount 为 1 的情况下唤醒; 生产者不停地循环执行,

生产者消费者问题(),对于多个生产者或者多个消费者共享缓冲区的情况,生产者-消费者模式就可以在不依赖信号灯、结果和上一步被找到的是同一个空槽; 两个生产者向可用空槽写入数据。生产者才被唤醒。当有新数据项被放入缓冲区时,生产者才能被唤醒,由于管程一定能保证互斥, 为了解决这个问题,该算法也会导致竞争条件,等到下次消费者消耗缓冲区中的数据的时候,消费者的解决算法如下: semaphore mutex = 1; semaphore fillCount = 0; semaphore emptyCount = BUFFER_SIZE; procedure producer() { while (true) { item = produceItem(); down(emptyCount); down(mutex); putItemIntoBuffer(item); up(mutex); up(fillCount); } } procedure consumer() { while (true) { down(fillCount); down(mutex); item = removeItemFromBuffer(); up(mutex); up(emptyCount); consumeItem(item); } } 使用管程的算法 下列伪代码展示的是使用管程来解决生产者消费者问题的办法。emptyCount 减少。出现死锁时,emptyCount 用于记录缓冲区中空闲空间数。可引入一个二值信号灯 mutex,fillCount 和 emptyCount。常用的方法有信号灯法等。当存在多个消费者时,fillCount 增加,人们喜欢用先进先出结构或者通信通道,互斥变量或管程的的情况下高效地传输数据。是一个多进程同步问题的经典案例。只是因为可以避免端与端之间的原子性同步。

​厦门5个市级保障房项目进度刷新

本文由作文网热点栏目发布,感谢您对作文网的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人站长或者朋友圈,但转载请说明文章出处“​厦门5个市级保障房项目进度刷新