2010-03-03 126 views
1

我想多線程的東西,我有我的程序設置,使我有一個結構/類的變量,將傳遞到每個線程進行處理。要刪除哪個指針?

在這個類中,有一些變量持有指向數組的數據,一些線程擁有從中讀取數據的公用數組,而不是重複這些數組,指針指向每個將它們指向一個數組的函數。這些常用數組在主程序中初始化,然後將類數組中的變量指向該數組,然後將該數組傳遞給線程。

我的問題是在哪個級別(主程序或線程)我應該使用delete命令來終止該陣列?另外,當我這樣做時,其他指針會發生什麼?他們是否自動刪除,或者我是否必須手動跟蹤這些。最後,如果我不小心刪除了一個數組而另一個線程仍在使用它,會發生什麼?

感謝,

-Faken

回答

1

如果刪除其他線程仍在使用數組,你得到了一個未定義的行爲,霧可能崩潰。

對於你的情況,我建議清理在主線程,所有的工作線程完成之後。

另一種可能性是使用共享指針,一旦沒有線程使用它們,它就會自動釋放資源(儘管要注意您需要保護您對共享指針的訪問 - 對於MSVC標準庫中的shared_ptr它受到保護automatically)。

1

刪除不修改指針,反而使得被指向unuseable內存。

所以一旦一些內存被刪除,你不能引用它。這僅僅是一個指針作爲多個指針是真的:

您可以使用,將使用引用計數,這樣,當所有的指針被釋放底層的內存只會被刪除共享指針。對於你的例子,你需要確保共享指針是線程安全的。

0

的處理(應用程序)內的所有變量都跨線程共享,任何修改的變量或存儲器將必須能夠訪問它,除非使用的是線程本地存儲(TLS)的所有線程的效果。

如果您刪除陣列,然後使用它的另一個線程,結果將是,當你刪除陣列一樣,那麼你重新訪問(訪問衝突主要是由於崩潰),它的地方在你的代碼。

至於「哪個級別」的問題,我認爲最好是通過創建對象的線程釋放對象以避免混淆,並確保這些對象不再需要被另一個線程使用。