2012-11-06 38 views
1

我有一些麻烦,在我的操作系统类家庭作业写Pseduocode,我们正在编程C.的伪码生产者消费者同步

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

我的主要困难是理解我的教授通过自旋等待变量的次数达到100,000次。我用粗体显示了令我困惑的部分。

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

回答

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

该死的很好的答案......但是:假设没有人理解这个问题是安全的,特别是问了这个问题的教授;-) – corlettk

2

忙着等待纺丝是一种技术,其中一个过程重复地检查以查看是否条件是true,如键盘输入是否是可用的,或者如果锁可用。

所以分配说后病情

同样每个消费者线程 应该出列从队列P*X/C项目和生产下一个元素和排队X不同的元素之前等待的ptime * 100000时间每次消费后,等待ctime * 100000

+0

我读了“自旋等待Ptime * 100,000 **周期**”,我将其解释为字面上的“处理周期”,即“时钟滴答”......即不是“时间”。 – corlettk

1

我怀疑你的教授的是一个完整的朴子 - 通过实际要求的worste“忙等待”技术,所有脑干:

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

我也怀疑他仍然采用了翼龙大腿骨头作为拐杖,有一个非常好的(干燥的)洞穴,还有一个大秃patch补丁的伴侣...... O/S家伙倾向于这样。它随着凉爽的胡须。

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

干杯。基思。