2012-11-29 23 views
4

本聲明:C++編譯器錯誤「不能是線程局部的,因爲它具有非POD類型」」

___thread A a; 

生成此錯誤:

cannot be thread-local because it has non-POD type

其中A是

class A{ 
     public: 
       // function declaration 
     private: 
       // data members 
}; 

我想這個在Linux上編譯,命令包括&和mk。 我們靜態線即我們的應用進來之前我們知道關於線程的數量,因此目前圍繞與聲明的陣列執行的操作的,即

A a[Number of threads]. 

我怎樣才能解決這個問題?

+2

看看__線程A * a;走在前面。 –

回答

2

假設您使用gcc,線程本地存儲僅支持POD類型(即純數據結構)。 您可以嘗試將數據抽取到單獨的struct中,並使其成爲本地線程(實際上,這在任何情況下都可能是個好主意,因爲在使方法線程本地方面沒有多大意義)。

+0

請注意,您可以將所有數據成員設置爲private,並將方法放在單獨的「friend」類中。 – ecatmur

+0

謝謝icepack。但是我沒有訪問類A的模板,因此我無法將類A更改爲結構A.類A已經被大量使用,因此我需要儘可能避免對類A的更改。其他解決方案我們認爲是在全局頭文件中聲明__thread A * a;並在線程init函數中有一個= new A()。但是現在我們不想從堆中爲A類分配內存,所以在任何情況下我們都需要使它運行語句__thread A a; –

+0

@CppDeveloper如果你對你的類的動態alloc/deallocs沒問題,我沒有看到任何問題。你的'a'實際上是一個'POD',就像需要的一樣。否則,您需要對「A」本身進行更改。最清潔的方式似乎是@ecatmur建議的方式。 – SomeWittyUsername

1

不幸的是,在C++ 03(對線程一無所知)中,不存在線程本地資源的動態初始化(和破壞)的事情。

在C++ 11中,thread_local存儲關鍵字允許以運行時開銷爲代價進行動態初始化(基本上相當於具有線程本地靜態變量),因此可以在沒有帶構造函數的類型的情況下使用。

在C++ 11中,同樣可以調用constexpr構造函數進行靜態初始化,因此應該與__thread說明符兼容,前提是編譯器要實現它。

相關問題