CPP std :: thread尝试使用已删除的函数

时间:2017-05-09 09:11:41

标签: c++ xcode multithreading c++11

首先,我想说我已经就这个问题进行了研究,但没有任何相关的内容......

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?

这是我的问题......:

clang错误:

/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);

如果有人可以帮助我,那真的很有帮助! :)

问候;)

2 个答案:

答案 0 :(得分: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上同时访问。

答案 1 :(得分:0)

它所抱怨的已删除函数是一个已删除的const线程复制构造函数。

对于已删除的功能问题,您可以使用:

threads.emplace_back(

而不是:

threads.push_back(

该评论者还提到的是该函数正在创建多个线程并向它们传递对同一个布尔返回变量的引用。

如果你不使用atomic_bool它会崩溃,即使你这样做,它们都会报告回同一个内存位置,如果其中一个返回false,该函数会错过通知。