2012-12-06 136 views
2

我有一個C++多線程應用程序,它在單獨的線程中運行任務。每個任務都有一個處理和存儲輸出的對象。每個任務創建不同的業務邏輯對象,可能還有另一個線程或線程池。幾個單例:每個任務一個

我想要做的是某種程度上的任何業務邏輯對象,它們由任務來訪問每個任務的輸出,無需手動傳遞「輸出」對象到每個業務邏輯對象提供運行一個簡單的方法。

我看到的是在TLS中創建輸出單例工廠並存儲task_id。但是問題出現在業務邏輯創建一個新的線程或線程池,並且這些線程在TLS中沒有task_id。這樣我需要有一個訪問父母的線程TLS。

另一種方法是在任務開始後簡單地獲取所有輸出。會有從那個時候不同的任務輸出,但至少,比什麼都沒有......

我在尋找的解決我的問題的乾淨漂亮的方式有任何建議或想法更好。謝謝。

upd:是的,它不是單數,我同意。我只是想能夠這樣訪問這個對象:

output << "message"; 

就是這樣。不用擔心在業務邏輯類之間傳遞指向輸出對象的指針。我需要每個任務都有一個全局輸出對象。

+3

多線程+單身=死亡+銷燬(通常) –

回答

1

從應用程序的角度來看,它們不是單身人士,那麼爲什麼要像單身人士那樣對待對象呢?

我會使輸出貯藏器的一個新實例和(智能?)指針傳遞給新的線程。主函數可能會將指針放在TLS中,從而使實例成爲每個線程的全局(我不認爲這是明智的設計缺陷,但它被問到)。在創建一個新的(sub - ?)線程時,可以再次傳遞指針。所以根據我的說法,不需要單身人士或工廠。

+0

是的,我想在約新創建的線程在TLS存儲指針。但我不太喜歡爲任務提供特殊的線程功能。 – DemonShi

+0

你打算如何在沒有TLS的情況下擁有「單線程每線程」?無論如何,我會去通過構造函數傳遞引用,而不會被單身打擾,但這是我的方法。 – stefaanv

+0

順便說一句:用TLS的方法,你會'output()<<「message」;'而不是'output <<「message」;' – stefaanv

0

如果我理解正確的話,你想有多個類實例(每個不一定是同一類)都能夠訪問需要是線程安全的一個公共數據池。我可以想到一些方法來做到這一點。第一個想法是將此數據池放入其他類中包含的類中。該數據池實際上將其數據存儲在一個靜態成員中,因此即使數據池類會有多個實例,也只有一個數據實例。然後,該類將擁有訪問此靜態數據池的訪問器方法(以便它是透明的)。爲了使線程安全,您需要訪問通過互斥體或類似的東西。

+0

不可以。每個任務內只有公用數據池。但是全球範圍內會有N個輸出對象和N個任務。 – DemonShi

+0

那麼,所有任務的輸出是否相同?如果不是在這種情況下,我真的不明白「訪問每個任務的輸出」是什麼意思。如果是這樣,那麼我的答案將起作用,並且您會將常見輸出視爲「數據池」。如果不是,那麼我會假設每個業務邏輯都會有一些理解它所需要的輸出部分的方法,所以仍然可以從中得出一個共同點。我希望有所幫助。如果我能更好地理解輸出結果以及某些任務的業務邏輯要做什麼,我將能夠提供更多幫助。 – hvanbrug

相關問題