2015-10-16 62 views
1

內啓動一個成員函數的線程這裏是我的類的快速概要:試圖從類

class foo{ 
public: 
    vector<string> rawData; 
    vector<vector<string> > slicedData; 
    void readData(); 
    void sortData(); 
private: 
    static void selectionSort(vector<string>); 
}; 

基本上,readData填充rawData從外部文件的信息。一旦這樣做,sortData將數據分成子集,其中每個存儲在slicedData。我需要產生一個selectionSort的線程來對每個子集進行排序,並且我必須在sortData內部這樣做。

我已經試過了內sortData這樣:

thread *threads = new thread[slicedData.size()]; 

for(int i = 0; i < slicedData.size(); i++){ 
    threads[i] = thread(selectionSort,slicedData[i]); 
} 

...但是當我這樣做,G ++拋出error: attempt to use a deleted function

爲了記錄,我需要將線程存儲在數組中,以便稍後加入。我意識到這可以通過boost庫和線程組更好地完成,但我試圖保持這個項目無依賴關係。

+0

請**用[mcve]或[SSCCE(Short,Self Contained,Correct Example)](http:// sscce。 org) – NathanOliver

+0

那麼'foo ==線程'? – ChiefTwoPencils

+0

不,它也會對數據做其他事情,只是沒有必要包含它們,因爲它們與此問題無關。 – IanCZane

回答

4

我無法重現您的錯誤,但下面的代碼爲我編譯。

我會建議使用載體線程並調用emplace_back()創建線程矢量內..

事情是這樣的:

class foo 
{ 
public: 
    std::vector<std::vector<std::string> > slicedData; 

    void sortData() 
    { 
     std::vector<std::thread> threads; 

     // for each slice add a new thread passing the function and data 
     // to its constructor 
     for(auto& slice: slicedData) 
      threads.emplace_back(&foo::selectionSort, std::ref(slice)); 
      // NOTE: use of std::ref() to pass by reference 

     // now join the threads to prevent the threads vector 
     // going out of scope before they finish 
     for(auto&& thread: threads) 
      thread.join(); 

    } 

private: 
    static void selectionSort(std::vector<std::string>&); // pass by reference 
}; 

另請注意我通過參考傳遞數據,因爲我暫停ct你並不是真的想要排序數據的副本。

+1

拼寫:* emplace * back。 –

+0

@KhouriGiordano謝謝。 – Galik

+0

thread.join是關鍵。斑點 –

0

錯誤不在您在此顯示的線程代碼中。很可能,您的sortData方法不會等待線程完成(如Galik所述,使用thread.join),並且foo超出範圍並在線程仍嘗試使用時被刪除。這就是爲什麼你看到「試圖使用已刪除的功能」