设计一个多线程编程的作业

7
本学期我是一门操作系统课程的助教。因此,被要求为具有有限C编程技能的计算机本科生设计一个多线程编程作业。
这个作业不应该很大,因为它只占最终成绩的5%。而且应该是新的东西,所以学生不能只从互联网上下载代码。
我的想法是设计一个简单的消息队列服务器。
我们将向学生提供一个非常简单的MQ服务器,它只有一个线程并仅接受2个客户端连接:阅读器和写入器。写入器定期向队列即服务器发送消息,而阅读器从队列即服务器读取消息。我们还将提供阅读器和写入器。
然后,我们要求学生修改服务器以同时接受多个读取器和写入器,同时还要求线程安全。换句话说,每个消息只能发送给一个读取器,并且在队列中没有消息丢失,这需要使用互斥锁。
我觉得这可能太简单了,但是我此时无法想到其他更好的作业。如果你处于我的位置,你会给出什么样的任务?

我不久前上了一门操作系统课程。他们的课程设置是基于斯坦福大学的Pintos操作系统课程的。这可能与你们计划的有所不同,但也许你们应该考虑在明年引入它。http://www.stanford.edu/class/cs140/projects/pintos/pintos_2.html顺便说一句,这是我整个计算机科学专业中最喜欢的课程。我感觉我真正理解了底层操作系统架构。 - Eve Freeman
4个回答

0

你在使用Unix嗎?並不是很重要, 這也可以用Windows來實現。

簡單來說, 創建一個命名管道。

然後創建4個線程。

1個控制線程,1個消費者(讀取)線程和2個生產者(寫入)線程。

生產者只需將字符串發送到管道中,而消費者則將字符串轉換為大寫或其他操作,並將其打印出來。

控制線程用於啟動和停止其他3個線程。 它接受簡單的命令:startProducer1,startProducer2,startConsumer,stop命令和關閉命令。

這展示了不同的線程各自工作,但同時由主程序控制(知道何時關閉等)。

如果您能將此包裝成簡單的GUI,甚至是一些簡單的Ncurses視頻顯示,以便控制顯示始終具有可見性以接受命令並顯示結果,那就更好了。

您可以展示如果啟動1個生產者但沒有消費者,線程將如何阻塞。 同時啟動兩個生產者或消費者沒有生產者的話,以及消費者沒有生產者時如何阻塞。

使用管道意味着您不必依賴外部程序(以及設置它的所有詳細信息,調試它配置它並支持它)。

Unix和Windows都有命名管道(但我认为系统调用是不同的,但POSIX可移植性可能会在这里正常工作...)。


0

你可以在连接池管理器的原始阶段创建一个连接池,可靠地使用和重复使用连接对象。

其次,你可以拥有一个httpclient,它可以执行多个仅限GET请求(因为其他请求会使它过于复杂),并且你应该能够验证与每个请求对应的所有响应(还可以取消请求)。

第三,最简单的方法是编写一个普通的服务器套接字,它可以接受每个不同的请求并将其分配给新的服务器线程完成请求并返回响应。

这就是我所能想到的。


0

哲学家就餐问题这样的经典问题的好处在于,可以很容易地演示死锁和饥饿问题,而不必深入实现细节。

如果你真的需要一些原创性的东西,尝试选择一个容易预见并发陷阱的项目。这样学生们更有可能遇到它们,并从任务中获得更多收益。否则,重新制定一个经典问题,使其与现有的互联网解决方案有所不同,但本质上仍然相同。


0

我会考虑要求学生提供一个线程化状态机来访问关键部分,例如机器人臂。

例如,机器人臂线程将包含公共方法,如“MoveArm(double position)”和“StopArm()”等,所有这些方法都会向机器人臂的信号队列发布信号。机器人臂线程将监视队列并逐个拉出信号并相应地执行,留下其他请求排队等待下一系列状态转换。这有意义吗?

这演示了如何序列化访问不仅是关键部分,而且是关键操作序列。

例如,从线程1(例如UI)调用的MoveArm将被发布到机器人臂信号队列中,一旦机器人臂线程在自己的线程中检测到信号,将通过以下状态移动:

  1. StartingToMoveArmState
  2. MovingArmState(在此我们可以监听StopArm信号(例如如果我们必须紧急停止等)
  3. ReadyState(一旦移动完成)。

当机器人臂线程正在处理线程1的移动手臂请求时,线程2可以通过调用StopArm()来中断,而这将在MovingArmState中处理。另外,线程2可以要求手臂移动到其他地方,但是机器人臂线程只会在回到ReadyState状态后才会执行该请求。也就是说,ReadyState只会出队下一个移动信号。

因此,信号队列需要是线程安全的,并且在线程1或2向其添加信号时需要进行锁定。此外,信号队列需要设置机器人臂线程为非阻塞状态,以便它可以检查并相应地执行该信号(使用例如手动复位事件)。

希望这对您有所帮助!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接