首页 文章

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

提问于
浏览
1

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

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

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

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

3 回答

  • 3

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

    while (current_time() <= wake_up_time);
    

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

    sleep(2 * 60 * 1000 ms);
    

    或者至少放弃一些CPU(即不要太紧):

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

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

    我不确定 cycles 是什么;在汇编中它们可能是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

  • 1

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

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

    我还怀疑他仍然使用翼龙大腿骨作为拐杖,有一个非常漂亮(干燥)的洞穴,还有一个带有大秃头补丁的伴侣...... O / S家伙往往就是这样 . 它配有凉爽的胡须 .

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

    干杯 . 基思 .

相关问题