2015-04-28 49 views
-1

我爲M數的int數組,我想產卵N個線程,將讀取它至少一個元素,並打印打印獨特的數組中的元素。 條件是 1.每個線程應打印唯一的元素 2.每個線程應打印至少一個元素。 我只需要一個如何實現的想法。使用線程

由於提前

+3

這是作業,你別無選擇,只能這樣做嗎?否則,它非常接近使用線程的最壞情況。這大概相當於說:「我想在世界各地航行,但不是一條船,我會在篩子上做。」 –

+0

其實我想要一個使用線程的選擇算法。 – user1254554

回答

1

警告:這是不是直接回答這個問題更多的是評論的(這是路太長,不適合在評論空間)。

與你在問什麼最根本的問題是,幾乎你想要做的一切都取決於(嚴重)上互動的所有數據之間,並且(如果你真的堅持用線程做)的所有線程之間。

的第一個要求是每個線程從一個組中選擇一個唯一的項目。選擇獨特的項目意味着所有線程至少有一些其他線程將選擇的數據的意識。

如果你願意做實質性的單一線程所有的工作,你可以這麼簡單。顯而易見的方法是對數據進行排序並刪除所有重複項。然後讓每個線程選擇一個唯一的元素是很簡單的:爲每個線程指定一個要選擇的元素的索引,然後完成。

不幸的是,這也意味着線程基本上沒有做的工作。

下一步就差了(可能更糟)。每個線程都需要打印出它的數據。至少假設像std::cout這樣的普通流類型的輸出機制,爲了避免混亂的結果,您需要使用類似互斥體的方法來確保一次只有一個線程打印某些內容,然後在完成其他某個線程和打印其輸出,等等。總之,它完全連續完成,以保持輸出有意義。爲了長話短說,所有真正的工作最終都由一個單獨的線程在開始時完成,以產生排序後的唯一數據,最後以串行方式寫出結果。它們之間的任務可以並行執行,如此微不足道,幾乎毫無意義。

線程理想的情況是這基本上所有方面相反。你希望能夠快速地分割數據,然後有很多線程去處理幾乎所有的實際工作,而不需要與其他線程同步。

現在,如果你願意將一些工作放到一個死衚衕的任務中,那麼可能至少有一部分與你列出的任務一起完成。例如,我們假設您關心的數據是數字。您可以從一個線程開始,將這些數字分割成多個範圍(例如,只查看最高有效數字)。然後,您可以爲每個範圍分配一個線程,以便將這些數字進一步細分(例如,基於下一個數字)。當您將數據劃分爲您想要的唯一數字的範圍時,每個線程只會從其範圍中選擇一個數字並將其打印出來。

對於小數字,使用線程執行此任務可能仍然是一個淨損失,但是如果您有足夠的輸入和(特別是)足夠大的輸入,通過查看僅幾位數字而非比較完整數字,這可能是一場勝利。