2017-05-09 4 views
0

最初に削除機能を使用するのstd ::スレッドの試み、私はすでに対象に研究を行っていませんが、関連する何と言いたい...CPPすべての

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

Xcode 7: C++ threads ERROR: Attempting 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)'のようなものでなければならず、 'thread'で' bool'を使うか、 '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する必要があります、またはスレッドによって1 boolを持っていなければならないはずです。それ以外の場合はretに同時にアクセスすることができます。

+0

ありがとうございました! :)しかし、それはまだvector :: push_back()で動作します。 –

+0

'emplace_back'を使用するのは、短い行になるためです(移動を避けていますか?)。 – Jarod42

0

削除機能は、constのスレッドの削除コピーコンストラクタです。削除された機能の問題については

、あなたが使用することができます。

threads.emplace_back(

の代わりに:

も呼ばコメンターは、関数が複数のスレッドを作成し、に渡していることは何ですか
threads.push_back(

をそれらは同じブールリターン変数への参照です。

atomic_boolを使用しないとクラッシュし、そうであってもすべてが同じメモリ位置にレポートされ、そのうちの1つがfalseを返すと関数が通知を逃します。

+0

それは私が最初の引数としてこれを書いている理由です。そして関数のアドレスをstd :: threadに送りました。私はそれが非静的関数メンバで動作することができることを知っています –

+0

私は私のコードのいくつかの週前にコンパイルした他の部分を持って、私はstd :: threadと非静的メンバ関数を呼び出した...私は本当になぜそれは同じファイル内にあります... –

+0

名前の前にアンダースコアで過負荷の名前を変更しようとしましたが、何も変わっていません...私はリブートすると思います。 –

関連する問題