尝试对C ++ 11线程使用已删除的函数

阿布舍克禁令

我正在尝试创建一个具有这样的构造函数的ThreadPool类

    ThreadPool(size_t numberOfThreads)
    : workerThreads(numberOfThreads) {
      workerThreads.reserve(numberOfThreads);
      for(int i =0; i < numberOfThreads; i++) {
        workerThreads.emplace_back(std::thread(&ThreadPool::doJob, this));
      }
    }

这无法为我编译,并引发以下错误

error: attempt to use a deleted function
    __invoke(_VSTD::move(_VSTD::get<1>(__t)), _VSTD::move(_VSTD::get<_Indices>(__t))...);
    ^
/Library/Developer/CommandLineTools/usr/include/c++/v1/thread:352:5: note: in instantiation of function template specialization
      'std::__1::__thread_execute<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct> >, void
      (ThreadPool::*)(std::__1::function<void (char *, std::__1::list<std::__1::basic_string<char>,
      std::__1::allocator<std::__1::basic_string<char> > > *)>), ThreadPool *, 2>' requested here
    __thread_execute(*__p, _Index());

根据类似问题的其他答案,我也尝试这样做

        workerThreads.emplace_back(std::thread(&ThreadPool::doJob, std::ref(*this)));

这也再现了同样的问题。我编译我的代码clang c++14在MacOS

这是完整的程序,其中复制了

class ThreadPool {
  public:
    ThreadPool(size_t numberOfThreads)
    : workerThreads(numberOfThreads) {
      for(int i =0; i < numberOfThreads; i++) {
        workerThreads[i] = std::make_shared<std::thread>(std::thread(&ThreadPool::doJob, this));
      }
    }

    ThreadPool(const ThreadPool& tp) {
      workerThreads = tp.workerThreads;
      jobQueue = tp.jobQueue;
    }

    std::function<void(char*, std::list<std::string>*)> getNextJob() {
      if(!jobQueue.empty()) {
        std::function<void(char*, std::list<std::string>*)> job = jobQueue.front();
        jobQueue.pop_front();
        return job;
      } 

      throw std::runtime_error("No jobs to process, thread finished");
    }

    void addWork(std::function<void(char*, std::list<std::string>*)> job) {
      lockListMutex.lock();
      jobQueue.push_back(job);
      lockListMutex.unlock();
    }

  private:
    // performs actual work
    void doJob(std::function<void(char*, std::list<std::string>*)> job) {
      try {
        lockListMutex.lock();
        getNextJob();
        lockListMutex.unlock();
      } catch (std::runtime_error &e) {

      }
    }

    // a vector containing worker threads
    std::vector<std::shared_ptr<std::thread>> workerThreads;

    // a queue for jobs
    std::list<std::function<void(char*, std::list<std::string>*)>> jobQueue;

    // a mutex for synchronized insertion and deletion from list
    std::mutex lockListMutex;
};

int main(int argc, char *argv[]) {
    int numThreads = 1;
    ThreadPool* pool = new ThreadPool(numThreads);
}

丹尼尔·兰格

由于doJob成员函数的参数job类型为std::function<void(char*, std::list<std::string>*)>,因此在调用此函数时需要提供相应的参数。因此,以这种方式在新线程中调用此函数无效:

std::thread(&ThreadPool::doJob, this)  // no argument for job passed

您可能需要提供一个参数,或者,因为可能应该从中将作业出队,所以从中jobQueue删除job参数doJob

void doJob()
{
   ... // dequeue job from jobQueue and execute it

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C ++线程和承诺:尝试引用已删除的函数

来自分类Dev

Xcode 7:C ++线程错误:尝试使用已删除的功能

来自分类Dev

C ++ 11 std :: thread std :: move尝试使用已删除的函数

来自分类Dev

C++多线程程序尝试使用删除函数

来自分类Dev

C ++ std :: thread“尝试使用已删除的函数”

来自分类Dev

递归传递的C ++函子:“尝试使用已删除的函数”

来自分类Dev

从向量c ++中删除对象,尝试引用已删除的函数

来自分类Dev

C ++多线程;使用已删除的函数/无法转换为右值

来自分类Dev

通过递归传递的C ++函子:“尝试使用已删除的函数”

来自分类Dev

如何使用已删除的副本构造函数初始化类数组(C ++ 11)

来自分类Dev

错误:使用已删除的函数std :: basic_ofstream(OpenCV和C ++ 11)

来自分类Dev

错误C2280:尝试引用已删除的函数(尝试调用vector.erase)

来自分类Dev

尝试实现C ++函数

来自分类Dev

C ++错误C2280-尝试引用已删除的函数-在原始类型上

来自分类Dev

C++ 错误 (C2280) 尝试访问已删除的函数

来自分类Dev

ifstream尝试引用已删除的函数

来自分类Dev

错误C2280:尝试引用已删除的函数(atomic <int>)

来自分类Dev

错误C2280:尝试引用已删除的函数(unique_ptr)

来自分类Dev

错误C2280:'std :: thread :: thread(const std :: thread&)':尝试引用已删除的函数

来自分类Dev

C ++ 11线程包装函数

来自分类Dev

C++:避免“使用已删除的函数”错误

来自分类Dev

错误:当我尝试使用引用时使用已删除的函数

来自分类Dev

尝试使用C ++ Move构造函数...失败

来自分类Dev

尝试使用OpenCV C ++绘制简单函数

来自分类Dev

尝试使用C ++ Move构造函数...失败

来自分类Dev

错误C2280:尝试引用已删除的功能

来自分类Dev

C2280尝试引用已删除的功能

来自分类Dev

在C中尝试使用指针

来自分类Dev

C ++ 11线程编译错误,删除了复制构造函数和std :: thread,为什么?

Related 相关文章

  1. 1

    C ++线程和承诺:尝试引用已删除的函数

  2. 2

    Xcode 7:C ++线程错误:尝试使用已删除的功能

  3. 3

    C ++ 11 std :: thread std :: move尝试使用已删除的函数

  4. 4

    C++多线程程序尝试使用删除函数

  5. 5

    C ++ std :: thread“尝试使用已删除的函数”

  6. 6

    递归传递的C ++函子:“尝试使用已删除的函数”

  7. 7

    从向量c ++中删除对象,尝试引用已删除的函数

  8. 8

    C ++多线程;使用已删除的函数/无法转换为右值

  9. 9

    通过递归传递的C ++函子:“尝试使用已删除的函数”

  10. 10

    如何使用已删除的副本构造函数初始化类数组(C ++ 11)

  11. 11

    错误:使用已删除的函数std :: basic_ofstream(OpenCV和C ++ 11)

  12. 12

    错误C2280:尝试引用已删除的函数(尝试调用vector.erase)

  13. 13

    尝试实现C ++函数

  14. 14

    C ++错误C2280-尝试引用已删除的函数-在原始类型上

  15. 15

    C++ 错误 (C2280) 尝试访问已删除的函数

  16. 16

    ifstream尝试引用已删除的函数

  17. 17

    错误C2280:尝试引用已删除的函数(atomic <int>)

  18. 18

    错误C2280:尝试引用已删除的函数(unique_ptr)

  19. 19

    错误C2280:'std :: thread :: thread(const std :: thread&)':尝试引用已删除的函数

  20. 20

    C ++ 11线程包装函数

  21. 21

    C++:避免“使用已删除的函数”错误

  22. 22

    错误:当我尝试使用引用时使用已删除的函数

  23. 23

    尝试使用C ++ Move构造函数...失败

  24. 24

    尝试使用OpenCV C ++绘制简单函数

  25. 25

    尝试使用C ++ Move构造函数...失败

  26. 26

    错误C2280:尝试引用已删除的功能

  27. 27

    C2280尝试引用已删除的功能

  28. 28

    在C中尝试使用指针

  29. 29

    C ++ 11线程编译错误,删除了复制构造函数和std :: thread,为什么?

热门标签

归档