2009-12-31 45 views

回答

2

您是否需要了解實現關鍵部分和信號量原語的算法?請參閱Process Synchronization(pdf)。請注意,有時您可能會看到使用關鍵部分實現的信號量,以確保測試修改操作的原子性。

消息隊列建立在同步基元之上。您尋求的消息隊列在優秀的Little Book of Semaphorespdf)的第4章中。

編輯補充:

我猜你的意思是什麼「的郵箱,」所以,如果這個答案是不行的,它會是有助於您定義郵箱是什麼。我瞭解練習是通過使用消息隊列等高級同步機制來實現P和V嗎?由於必須保護消息隊列免受併發問題的影響,這是一個簡單的練習。

鑑於這是保證線程安全類郵箱,並具有下列方法:

  • 排隊(消息) - 添加消息到郵箱。如果有任何線程被阻塞,請喚醒一個線程。
  • 出列 - 從郵箱中刪除郵件,如果郵箱爲空則阻塞。

然後信號燈類需要有這些方法:

any_message任何消息都沒有。不管它是什麼,因爲我們只使用消息隊列來喚醒阻塞的線程。

此算法模擬不能具有負值的信號量。一個可以用負值創建的信號量需要做更多的工作。你需要哪些?

+0

我對信號量的算法(等待和信號算法)有所瞭解。 我不知道如何模擬郵箱的信號隊列。 當我們在等待程序中說: semaphore.count--; 如果(semaphore.count <0) 地方這個過程中semaphore.queue並阻止此過程 ,當我們在siganl過程,說: semaphore.count ++; 如果從semaphore.queue和地方在準備列表(semaphore.count <= 0) 刪除進程p 現在應該怎麼辦,這些與郵箱? 哪裏必須放置進程? – Hero 2010-01-01 08:52:40

+0

哈米德,我添加到答案。 – 2010-01-01 19:42:04

+0

是的,一個負值的信號量(用於互斥)。 哪裏應該放置線程? (當我們向郵箱添加消息時,線程從哪裏喚醒?) 我們應該像Semaphore一樣考慮一個線程隊列嗎? – Hero 2010-01-02 14:57:00