std :: std :: thread后代的向量

时间:2015-03-07 16:38:05

标签: c++ multithreading c++11 vector stl

我正在尝试使用destroy中的自动连接属性创建一个线程向量。 Stroustrup建议使用guarded_thread:

struct guarded_thread : std::thread {
    using std::thread::thread;
    ~guarded_thread() { if (joinable()) join(); }
};

这个guarded_thread就像魅力一样:

void f() { std::cerr << "f();" << std::endl; }
int main() { guarded_thread gt(f); }

但只要我不想在矢量中存储其中的几个:

void f() { std::cerr << "f();" << std::endl; }
int main() { std::vector<guarded_thread> v; v.emplace_back(f); }

实际上emplace_back()或push_back()会让编译器发出一条非常长的错误消息,抱怨std :: result_of中找不到“type”,但我不明白为什么std :: result_of会用guarded_thread实例化()作为模板参数。 Thread在我的STL实现上有一个模板构造函数:

template<typename _Callable, typename... _Args>
  explicit
  thread(_Callable&& __f, _Args&&... __args)
  {
  #ifdef GTHR_ACTIVE_PROXY
    __asm ("" : : "r" (&pthread_create));
  #endif
    _M_start_thread(_M_make_routine(std::__bind_simple(
            std::forward<_Callable>(__f),
            std::forward<_Args>(__args)...)));
  }

问题是:不知何故_Callable被替换为guarded_thread,但我不明白为什么。也许复制构造函数试图被调用?怎么可能修好?

我尝试了两种不同的编译器:

  • g ++(Debian 4.9.1-19)4.9.1
  • Debian clang版本3.5.0-9

大概都抱怨同样的错误。

1 个答案:

答案 0 :(得分:4)

似乎guarded_thread缺少默认移动构造函数,应删除复制构造函数。

Here是一个有效的例子。

guarded_thread(const guarded_thread&) = delete ;
guarded_thread(guarded_thread&&) = default ;

注意:您的代码正在调用已删除的函数,即std::thread复制构造函数,并且也没有提供移动构造函数。