2012-01-10 44 views
7

本學期我是OS課程的TA。所以我要求設計多線程編程的分配的CS本科生有限的C++編程技巧設計多線程編程任務

這不應該是一個大的任務,因爲只需要最後成績的5%。這應該是新的東西,所以學生不能只從互聯網上下載一些代碼。

下面是我在想什麼,一個簡單的Message Queue服務器。

我們將提供學生一個非常虛擬服務器MQ其中只有一個 線程,並只接受2客戶端連接,讀者和作家。 作者週期性地向隊列發送消息,即服務器,並且 閱讀器從隊列中讀取消息,即服務器將 消息發送給閱讀器。我們還將爲讀者提供作者和 。

然後我們要求學生修改服務器同時接受多個 讀者和作家。而且我們也會要求線程 安全。換句話說,一條消息應該只發送給一個閱讀器,並且隊列中不會有消息丟失,這需要使用互斥體。

我覺得它可能太簡單了,但我現在還想不出其他什麼。如果你在我的位置上,你會給你什麼任務?

+0

我參加了一個操作系統類,不久前。他們將stanford pintos OS課程的課程建模。這可能與你們計劃的變化相差太大,但也許你應該考慮明年。 http://www.stanford.edu/class/cs140/projects/pintos/pintos_2.html 編輯:順便說一句,這是我最喜歡的整個CS專業課。我感覺我真的瞭解了底層的操作系統架構。 – 2012-01-10 03:24:36

回答

0

您使用的是Unix嗎?這並不重要,你也可以使用Windows。

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

然後創建4個線程。

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

生產者只需向管道發送一個字符串,然後消費者接收該字符串,將該字符串大寫,然後將其打印出來。

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

這表明不同的線程對自己的所有工作,但由主被控制的同時(知道何時關閉等)。

獎勵積分,如果你可以用,這是一個簡單的圖形用戶界面,甚至一些簡單的Ncurses的視頻顯示,以便控制顯示器總是有知名度接受命令並顯示結果。

你可以顯示你是否開始1生產者,但沒有消費者,線程將如何阻塞。兩個生產者都一樣,或者消費者如何阻止沒有生產者。

使用管道意味着你不必依賴於外部程序(並設置它,調試它配置它,支持它的所有細節)。

Unix和Windows都有命名管道(但系統調用我認爲是不同的,但POSIX可移植性可能就在這裏......)。

0

您可以在原始階段擁有連接池管理器,它只創建一個連接池並可靠地使用和重用連接對象。

其次,你可以有一個可以執行多個GET請求的httpclient(因爲其他的會使得它太複雜),你應該能夠驗證每個請求對應的所有響應(也可以用它來取消請求)。

第三最簡單的寫一個普通的服務器套接字,它可以接受每個不同的請求,並將其分配給新的服務器線程完成請求並返回響應。

這就是我能想到..

0

的經典問題,如Dining Philosphers的好處是,死鎖和飢餓很容易證明沒有得到深入實施細則。

如果您真的需要一些原創的東西,請嘗試選擇一個易於預見併發陷阱的項目。通過這種方式,學生可能會遇到他們並從作業中獲得更多。否則,重新制定一個經典問題,以便與現有的互聯網解決方案有所不同,但本質上仍然相同。

0

我會試圖要求學生提供一個線程狀態機來訪問關鍵部分,例如機器人手臂。

例如機器人手臂線程將包含諸如「MoveArm(double position)」和「StopArm()」等公共方法,所有這些方法都將信號發佈到機器人手臂的信號隊列中。機器人手臂線程會監視隊列並逐個關閉一個信號,並相應地採取行動,使其他請求排隊等待下一個狀態轉換序列。這有意義嗎?

這演示瞭如何將訪問序列化到關鍵部分,但是關鍵序列的操作。

例如MoveArm從線程1(例如UI)稱爲將在機器人手臂信號隊列發佈,並且一旦使機器人手臂線程檢測到其自己的線程的信號,將經過下面的狀態從readyState的移動:

  1. StartingToMoveArmState
  2. MovingArmState(在這裏我們可以監聽StopArm信號(例如,如果我們不得不緊急停止等)
  3. readyState的(一次移動完成)。

線程2可以同時在機器人手臂線程處理線程1的請求移動手臂,調用StopArm() - 和這將在MovingArmState中處理。此外,線程2可能會要求手臂移動到其他地方,但機器人手臂線程在它返回到ReadyState之前不會進行維護。即ReadyState只會排隊下一個要移動的信號。

因此,信號隊列需要是線程安全的,並在線程1或2向其添加信號時鎖定。此外,信號隊列需要設置機器人手臂線程解鎖,以便隨後檢查該信號並採取相應措施(例如使用手動復位事件)。

希望這可能會有用!