2017-05-09 189 views
0

首先是CPP的std ::線程的嘗試,我想說的是,我已經就這一主題使用刪除功能

Xcode 7: C++ threads ERROR: Attempting to use a deleted function研究,但沒有相關的...

Error creating std::thread on Mac OS X with clang: "attempt to use a deleted function") )

xcode - "attempt to use a deleted function" - what does that mean?

這是我的問題... ...:

鐺錯誤:

/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/thread:347:5: error: attempt to use a deleted function 
__invoke(_VSTD::move(_VSTD::get<0>(__t)), _VSTD::move(_VSTD::get<_Indices>(__t))...); 

這是我的代碼:

bool GenAI::loadAIs() 
{ 
    bool ret = true; 

    if (_nbThread > 1) 
    { 
     std::vector<std::thread> threads; 

     for (unsigned int i = 0; i < _nbThread; ++i) 
      threads.push_back(std::thread(static_cast<void (GenAI::*)(bool &, unsigned int)>(&GenAI::loadAIs), this, ret, i)); 
     for (unsigned int i = 0; i < _nbThread; ++i) 
      threads[i].join(); 
    } 
    else 
     loadAIs(ret, 0); 
    return ret; 
} 

// And the prototype of the function that i try to call 
void GenAI::loadAIs(bool & ret, unsigned int iThread); 

如果有人可以幫助我,會非常有幫助! :)

問候;)

+3

它應該像'std :: ref(ret)',你應該有'bool'通過'thread'或使用'std :: atomic '...... – Jarod42

+0

非常感謝你,它是沒有編譯的std :: ref(ret)...如果你把它寫成答案,我將能夠關閉這張票:) –

回答

1

要傳遞給線程的引用,您必須使用std::reference_wrapper,您可以使用std::ref獲取該引用。所以,你的代碼就變成了:

threads.emplace_back(static_cast<void (GenAI::*)(bool &, unsigned int)>(&GenAI::loadAIs), 
        this, 
        std::ref(ret), 
        i)); 

注: bool ret大概應該是std::atomic<bool> ret,還是應該應該有一個線程bool。否則,您可能同時訪問ret

+0

謝謝你很多! :)但它仍然適用於vector :: push_back(); –

+0

我使用了'emplace_back',因爲它縮短了行(並避免了一個(消失?)移動)。 – Jarod42

0

刪除的功能,它是抱怨是常量線程刪除的拷貝構造函數。

被刪除的功能的問題,你可以使用:

threads.emplace_back(

相反的:

threads.push_back(

什麼評論者還提到的是,該功能是創建多個線程,並傳遞給他們對同一個布爾返回變量的引用。

如果你不使用atomic_bool,它會崩潰,即使你這樣做,他們也會報告回同一個內存位置,如果其中一個返回false,這個函數會丟失通知。

+0

這就是爲什麼我把它寫成第一個參數。我發函數地址爲std :: thread。我知道它可以與非靜態函數成員 –

+0

一起工作我有我的代碼的其他部分,我編譯幾周前,我確實調用非靜態成員函數與std ::線程...我真的不知道爲什麼不工作...加上它是在同一個文件... –

+0

我試圖重命名重載名稱前面的下劃線,但沒有任何改變...我開始認爲重新啓動大聲笑 –