[英]C++ Vectors / Classes /Threading
我正在使用Win7 / VS2008(9)SDK 6 / 7.1
我在使用的代碼中遇到問題
迷你版代碼如下
class CONNECTION
{
int/std::string/bool vars; // just to make it simple
CONNECTION ( int defaultvar );
CONNECTION ( const CONNECTION& copycon )
~CONNECTION ( );
DWORD static WINAPI staticstart( void *param ) //HACK to use createthread on classes
{ return ((CONNECTION *)param)->main); } // yea it works fine
DWORD main();
};
此類沒有帶副本和析構函數的默認構造函數,所有變量均被良好復制,並且析構函數沒有任何遺忘,構造函數很簡單,因為將參數分配給var ..省略了所有var和代碼以使其簡單,因為它們不是概率。
class main
{
std::vector<CONNECTION> con;
int addcon( int defaultvarofcon )
{
CONNECTION temp( defaultvar );
con.push_back( temp );
return con.size() - 1;
}
}
到目前為止,當我運行僅包含include和此代碼的控制台測試程序時,效果很好
main mymainclass;
mymainclass.addcon( 0 );
程序運行良好,關閉無錯誤
但是當我添加額外的代碼時
main mymainclass;
mymainclass.addcon( 0 );
mymainclass.addcon( 1 );
mymainclass.addcon( 2 );
兩次檢查我的代碼后,程序由於訪問沖突而崩潰,我在所有線程上對其進行了逐步調試,發現主線程只能在使用一個元素的情況下才能讀取主線程和工作線程中所有向量類/元素的正確值在矢量
但是,如果我像第二個代碼那樣使用多個代碼,則無法訪問其自己線程上所有元素上的所有數據(錯誤的指針)。 但是在主線程上它們仍然正確並顯示正確的值
誰能幫我弄清楚這段代碼有什么問題嗎?
std::vector
並非設計為線程安全的。 因此,您必須使用某種互斥鎖來確保一次只有一個線程訪問它。
否則,如果任何線程調整了向量的大小,則向量可能必須分配新的存儲空間,復制元素,然后釋放舊的存儲空間……並且在其他線程正在使用它的情況下顯然釋放舊的存儲空間是非常不好的事情。
您需要自己分配CONNECTION
對象。 讓std::vector
管理它們意味着當向量調整大小時,它們將在內存中四處移動,而其他線程持有的指針則懸空了。 調整向量的大小會使指向其任何內容的所有指針無效。
如果需要自定義析構函數和復制構造函數,則可能還需要自定義賦值運算符。
否則,您很快會導致類的多個實例引用相同的內部指針/ ...,從而容易導致內存損壞和訪問沖突。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.