这学期我是OS课程的助教。因此,我被要求为具有有限C编程技能的CS本科生设计一份多线程编程的作业。
这不应该是一个很大的任务,因为它只需要5%的最终成绩。这应该是新的东西,这样学生就不能从互联网上下载一些代码了。
下面是我的想法,一个简单的消息队列服务器。
我们将为学生提供一个非常虚拟的MQ服务器,它只有一个线程,只接受两个客户端连接,一个阅读器和一个作者。写入器周期性地向队列(即服务器)发送消息,读取器从队列中读取消息,即服务器将消息发送给读取器。我们还将提供读者和作者。 然后,我们要求学生修改服务器,同时接受多个读者和作者。我们也会要求线程安全。换句话说,消息应该只发送一个读取器,队列中不会丢失任何消息,这需要使用互斥锁。
我觉得这可能太简单了,但此刻我想不出任何其他的事情。如果你在我的位置,你会给什么任务?
发布于 2012-01-10 03:34:17
你在用Unix吗?这并不重要,您也可以使用Windows进行此操作。
简单地,创建一个命名管道。
然后创建4个线程。
一个控制线程,一个使用者(读取器)线程,和两个生产者(写入器)线程。
生产者只需将一个字符串发送到管道,而使用者获取该字符串,大写它或其他什么,并打印出来。
控制线程用于启动和停止其他3个线程。它需要简单的命令: startProducer1、startProducer2、startConsumer、停止命令和关闭命令。
这显示了不同的线程都是独立工作的,但同时由主线程控制(知道何时关闭,等等)。
加分如果你可以包装这是一个简单的GUI,甚至一些简单的Ncurses视频显示,使控制显示始终具有可见性,以接受命令和显示结果。
如果启动了1个生产者,但没有使用者,您可以显示线程将如何阻塞。相同的两个生产者,或如何消费者阻止没有生产者。
使用管道意味着您不必依赖该外部程序(以及设置它、调试它和支持它的所有细节)。
Unix和Windows都有命名管道(但我认为系统调用不同,但是POSIX可移植性可能只在这里工作.)。
发布于 2012-01-10 03:34:23
您可以在连接池管理器的原始阶段创建一个连接池,并且能够可靠地使用和重用一个连接对象。
其次,您可以拥有一个httpclient,它可以只执行多个GET请求(因为其他请求会使其过于复杂),并且您应该能够验证与每个请求对应的所有响应(还可以使其用于取消请求)。
第三,最简单的编写一个简单的服务器套接字,它可以接受每个不同的请求并将其分配给新的服务器线程,完成请求并返回响应。
这就是我能想到的..。
发布于 2012-01-10 04:12:17
典型问题(如餐饮哲人 )的好处是,在不深入了解实现细节的情况下,很容易演示死锁和饥饿。
如果你真的需要一些原创的东西,试着选择一个很容易预见并发陷阱的项目。这样,学生们很可能会遇到他们,从作业中得到更多。否则,重新制定一个经典的问题,使它与现有的互联网解决方案有足够的不同,但在本质上仍然一样。
https://stackoverflow.com/questions/8798147
复制相似问题