【问题标题】:Pseudo Code for Producer Consumer Synchronization生产者消费者同步的伪代码
【发布时间】:2012-11-06 04:29:34
【问题描述】:

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

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

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

我了解时间戳将用于打印每个线程之间的差异。我们目前正在使用信号量并实现同步。对上述查询的任何建议将不胜感激。

【问题讨论】:

    标签: c semaphore pseudocode


    【解决方案1】:

    我猜这意味着忙着等待;反复检查循环条件并在紧密循环中消耗不必要的 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
    

    尽管询问谁发布了作业总是最安全的。

    【讨论】:

    • 该死的好答案...但是:可以肯定地假设没有人理解这个问题,尤其是提出这个问题的教授;-)
    【解决方案2】:

    busy-waitingspinning 是一种让进程反复检查条件是否为true 的技术,例如键盘输入是否可用,或者如果有锁。

    所以任务说在产生下一个元素之前等待 Ptime*100000 时间,并在条件为 true 后将 x 个不同的元素排入队列

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

    【讨论】:

    • 我读到“spin-waiting for Ptime*100,000 cycles”,我将其解释为字面的“处理周期”,也就是“时钟滴答”......即不是“时间” .
    【解决方案3】:

    我怀疑你的教授是个彻头彻尾的笨蛋——实际上要求使用现有最糟糕的“忙着等待”技术:

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

    我还怀疑他仍然使用翼龙大腿骨作为拐杖,有一个非常漂亮(干燥)的洞穴,还有一个有大块秃头的伙伴...... O / S家伙往往是这样的.它与凉爽的胡须相得益彰。

    难怪他完全现代的学生会误解他。他需要(重新)学习如何在 TUNE 中咕哝。

    干杯。基思。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-13
      • 2018-01-07
      • 2018-10-16
      相关资源
      最近更新 更多