2011-08-25 61 views
3

假設我有一個具有靜態函數的類。該類的構造函數使用靜態函數作爲其入口點執行pthread_create。C++靜態函數複製

我的問題是:

如果我有這個類的多個實例,它們都將運行使用該函數自己的線程?這樣做有什麼問題嗎?而且...如果函數本身有靜態變量,我是否會遇到一個問題,它不能重入?

+0

不太清楚'自己的線程'是什麼意思,但最後一個問題的答案是肯定的,你會遇到問題。 – john

+0

如果您將每個類的「this」指針傳遞到您的靜態函數入口點,以便每個線程都可以從其自己的類實例中訪問成員,那麼您就不會遇到任何問題。 – Erik

回答

3

如果您的構造函數每次都執行pthread_create(),那麼您將擁有與對象一樣多的線程。如果這些線程訪問類中的變量,則需要確保對這些變量的訪問受互斥鎖保護。 (另外,如果這些線程訪問非static變量,則您也需要保護這些,而不是其他調用者到對象的方法)。

每個對象一個線程可能太多了,所以您可能需要重新考慮您的設計。

1

是的,所有的類都會啓動一個具有相同功能的新線程。就像他們使用非成員函數一樣。

至於函數靜態變量,是個問題。因爲C++實際上並沒有定義任何關於併發的東西,所以你可能正在尋找競爭條件。即使在這些函數靜態變量的構造中。在C++ 0x支持可用之前,您需要爲CPU尋找針對編譯器的線程功能,以便您可以告訴它將這些函數靜態變量設置爲「線程本地」。這樣,每個線程都獲得它們自己的副本。