生产者消费者同步的伪代码

时间:2012-11-06 04:29:35

标签: c semaphore pseudocode

我在使用C编程的操作系统类中编写Pseduocode作业作业时遇到了一些麻烦。

  

您将实现一个Producer-Consumer程序,其中包含N个元素,P生产者线程和C消费者线程的有界缓冲队列   (N,P和C应该是程序的命令行参数,以及下面描述的三个附加参数X,Ptime和Ctime)。的每个
  生产者线程应该将不同的数字排队到队列中(在每次调用Enqueue之间旋转等待Ptime * 100,000个循环)。每个消费者线程
  应该从队列中排队P * X / C项目(旋转等待Ctime * 100,000个循环   在每次调用Dequeue之间。)
主程序应该创建/初始化   有界缓冲区队列,打印时间戳,产生C消费者线程& P
  生产者线程,等待所有线程完成,然后打印另一个   时间戳&执行的持续时间。

我的主要困难是通过旋转等待变量乘以100,000来理解我的教授的意思。我加粗了那令我困惑的部分。

我理解时间戳将用于打印每个线程之间的差异。我们目前正在使用信号量并实现同步。对上述问题的任何建议都将非常感激。

3 个答案:

答案 0 :(得分:3)

我猜这意味着忙碌的等待;反复检查循环条件并在紧密循环中消耗不必要的CPU功率:

while (current_time() <= wake_up_time);

理想情况下,可以使用一些东西来暂停你的线程,直到它被调度程序外部唤醒(因此CPU之类的资源可以转移到其他地方):

sleep(2 * 60 * 1000 ms);

或至少放弃某些 CPU(即

while (current_time() <= wake_up_time)
    sleep(100 ms);

但我想他们不希望你手动调用调度程序,暗示操作系统(或你的线程库)是进行上下文切换的好时机。

我不确定周期是什么;在汇编中它们可能是CPU周期但是考虑到你的问题被标记为C,我敢打赌它们只是循环迭代:

for (int i=0; i<Ptime*100000; ++i); //spin-wait for Ptime*100,000 cycles

虽然询问是谁发出作业总是最安全的。

答案 1 :(得分:2)

忙等待旋转是一种技术,在此过程中,流程会反复检查条件是否为true,例如键盘输入是否可用,或者如果有锁可用。

所以赋值是在生成下一个元素之前等待 Ptime * 100000 时间,并在条件为 true后将x排列为不同的元素

类似于每个消费者线程 应该从队列中取消P*X/C项并在每次消耗项目后等待ctime * 100000

答案 2 :(得分:1)

我怀疑你的教授是一个完整的putz - 实际上是在考虑为了存在的“繁忙的等待”技术:

int n = pTime * 100000;
for ( int i=0; i<n; ++i) ; // waste some cycles.

我还怀疑他仍然使用翼龙大腿骨作为手杖,有一个非常漂亮(干燥)的洞穴,还有一个带有大秃头的伴侣...... O / S家伙往往是这样的。它伴随着很酷的胡须。

难怪他彻底的现代学生误解了他。他需要(重新)学习如何在TUNE中哼哼。

干杯。基思。