2010-01-07 21 views
1

我有一個圖像生成器,它將受益於在線程中運行。我打算使用POSIX線程,並根據https://computing.llnl.gov/tutorials/pthreads/#ConVarSignal編寫了一些模擬代碼來測試事情。使用線程,我應該如何處理理想情況下應該按順序發生的事情?

在預期的程序中,當使用GUI時,我希望生成的行從一個接一個地出現到下一個(圖像生成可能非常慢)。

還應該注意,線程中生成的數據不是實際的圖像數據。線程數據被讀取並轉換成RGB數據並放入實際的圖像緩衝區中。在GUI中,線程生成數據轉換爲RGB數據的方式可以在圖像生成過程中進行更改,而無需停止生成圖像。

但是,線程調度程序並不能保證線程會按我想要的順序運行,這不幸使得線程生成數據的轉換變得更加棘手,這意味着保留數組以保持bool值的不良解決方案以指示哪些行完成。

我該如何處理?

目前我有一個觀察者線程來報告圖像完成時(這真的應該是一個進度條,但我還沒有那麼遠,它使用pthread_cond_wait)。和幾個渲染線程在做

next_line()做一個互斥鎖,並獲取img_next_line的值,然後遞增它並解鎖互斥鎖。然後渲染該行並執行互斥鎖(與第一個不同)以獲取lines_done對高度的檢查,如果完成,則解鎖並解鎖並返回0,否則返回1。

+0

只是覺得我最好提一下,觀察者線程,渲染線程和next_line函數的上述實現在沒有GUI的情況下工作到複雜的事情。 – 2010-01-07 12:53:54

回答

2

鑑於線程可能在不同核心上並行執行,結果將不按順序到達是非常不可避免的。我認爲你用一組標誌跟蹤完整內容是非常合理的。

如果使用不同粒度的線程,整體效果可能會更好。說給每個線程(比如說)20個工作線,而不是一個。然後完成你會有更大的塊可供繪製,也許繪製條紋看起來不錯?

+0

有趣的是,你提到每個線程工作的行數,而不是1.我已經要求在其他地方採用一般方法,但有人提到工作在塊上,比如說20x20。 – 2010-01-07 07:30:29

1

只要接受行將以非確定性順序完成;這聽起來像是在發生,因爲它們需要不同的時間來渲染,在這種情況下,強制執行完成命令會浪費CPU時間。

+0

絕對不希望在這裏浪費CPU時間。 – 2010-01-07 07:31:29

0

這聽起來很愚蠢,但作爲一個用戶,我不希望看到一行從上到下緩慢渲染。它使緩慢的過程看起來更慢,因爲用戶已經完全預測了接下來會發生什麼。最好在準備好的時候渲染,即使它散佈在某個地方(無論是單線還是更好的塊,還有一些建議的塊)。它使得它看起來更隨機,因此對於像我這樣的用戶來說更具吸引力,更無聊。

相關問題