使用成员函数启动线程

使用成员函数启动线程

我试图std::thread用一个不带参数和返回的成员函数构造一个void。我无法弄清楚任何有效的语法 - 编译器无论如何都会抱怨。实现的正确方法是什么,spawn()以便返回std::thread执行的test()

#include <thread>class blub {
  void test() {
  }public:
  std::thread spawn() {
    return { test };
  }};


长风秋雁
浏览 765回答 4
4回答

哈士奇WWW

#include&nbsp;<thread>#include&nbsp;<iostream>class&nbsp;bar&nbsp;{public: &nbsp;&nbsp;void&nbsp;foo()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;<<&nbsp;"hello&nbsp;from&nbsp;member&nbsp;function"&nbsp;<<&nbsp;std::endl; &nbsp;&nbsp;}};int&nbsp;main(){ &nbsp;&nbsp;std::thread&nbsp;t(&bar::foo,&nbsp;bar()); &nbsp;&nbsp;t.join();}编辑:计算你的编辑,你必须这样做:&nbsp;&nbsp;std::thread&nbsp;spawn()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;std::thread(&blub::test,&nbsp;this); &nbsp;&nbsp;}更新:我想解释一些问题,其中一些也在评论中讨论过。上述语法是根据INVOKE定义(第20.8.2.1节)定义的:定义INVOKE(f,t1,t2,...,tN)如下:(t1。* f)(t2,...,tN)当f是指向类T的成员函数的指针时,t1是类型为T的对象或对类型为T的对象的引用或对类型T的引用源自T的类型的对象;((* t1)。* f)(t2,...,tN)当f是指向类T的成员函数的指针时,t1不是前一项中描述的类型之一;t1。* f当N == 1且f是指向类T的成员数据的指针时,t 1是类型T&nbsp;的对象或对类型为T的对象的引用或对从中派生的类型的对象的引用吨;(* t1)。* f当N == 1且f是指向类T的成员数据的指针时,t 1不是前一项中描述的类型之一;f(t1,t2,...,tN)在所有其他情况下。我要指出的另一个一般事实是,默认情况下,线程构造函数将复制传递给它的所有参数。原因是参数可能需要比调用线程更长,复制参数保证了这一点。相反,如果您想真正传递引用,则可以使用std::reference_wrapper创建的std::ref。std::thread&nbsp;(foo,&nbsp;std::ref(arg1));通过这样做,您承诺在线程对它们进行操作时,您将保证参数仍然存在。请注意,上面提到的所有内容也可以应用于std::async和std::bind。

月关宝盒

由于您使用的是C ++ 11,因此lambda-expression是一个很好的清洁解决方案。class&nbsp;blub&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;test()&nbsp;{} &nbsp;&nbsp;public: &nbsp;&nbsp;&nbsp;&nbsp;std::thread&nbsp;spawn()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;std::thread(&nbsp;[this]&nbsp;{&nbsp;this->test();&nbsp;}&nbsp;); &nbsp;&nbsp;&nbsp;&nbsp;}};因为this->可以省略,它可以缩短为:std::thread(&nbsp;[this]&nbsp;{&nbsp;test();&nbsp;}&nbsp;)要不就std::thread(&nbsp;[=]&nbsp;{&nbsp;test();&nbsp;}&nbsp;)

慕运维8079593

@ hop5和@RnMss建议使用C ++ 11 lambdas,但是如果你处理指针,你可以直接使用它们:#include&nbsp;<thread>#include&nbsp;<iostream>class&nbsp;CFoo&nbsp;{ &nbsp;&nbsp;public: &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;m_i&nbsp;=&nbsp;0; &nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;bar()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;++m_i; &nbsp;&nbsp;&nbsp;&nbsp;}};int&nbsp;main()&nbsp;{ &nbsp;&nbsp;CFoo&nbsp;foo; &nbsp;&nbsp;std::thread&nbsp;t1(&CFoo::bar,&nbsp;&foo); &nbsp;&nbsp;t1.join(); &nbsp;&nbsp;std::thread&nbsp;t2(&CFoo::bar,&nbsp;&foo); &nbsp;&nbsp;t2.join(); &nbsp;&nbsp;std::cout&nbsp;<<&nbsp;foo.m_i&nbsp;<<&nbsp;std::endl; &nbsp;&nbsp;return&nbsp;0;}输出2从这个答案重写的样本将是:#include&nbsp;<thread>#include&nbsp;<iostream>class&nbsp;Wrapper&nbsp;{ &nbsp;&nbsp;public: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;member1()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;<<&nbsp;"i&nbsp;am&nbsp;member1"&nbsp;<<&nbsp;std::endl; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;member2(const&nbsp;char&nbsp;*arg1,&nbsp;unsigned&nbsp;arg2)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;<<&nbsp;"i&nbsp;am&nbsp;member2&nbsp;and&nbsp;my&nbsp;first&nbsp;arg&nbsp;is&nbsp;("&nbsp;<<&nbsp;arg1&nbsp;<<&nbsp;")&nbsp;and&nbsp;second&nbsp;arg&nbsp;is&nbsp;("&nbsp;<<&nbsp;arg2&nbsp;<<&nbsp;")"&nbsp;<<&nbsp;std::endl; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::thread&nbsp;member1Thread()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;std::thread(&Wrapper::member1,&nbsp;this); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::thread&nbsp;member2Thread(const&nbsp;char&nbsp;*arg1,&nbsp;unsigned&nbsp;arg2)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;std::thread(&Wrapper::member2,&nbsp;this,&nbsp;arg1,&nbsp;arg2); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}};int&nbsp;main()&nbsp;{ &nbsp;&nbsp;Wrapper&nbsp;*w&nbsp;=&nbsp;new&nbsp;Wrapper(); &nbsp;&nbsp;std::thread&nbsp;tw1&nbsp;=&nbsp;w->member1Thread(); &nbsp;&nbsp;tw1.join(); &nbsp;&nbsp;std::thread&nbsp;tw2&nbsp;=&nbsp;w->member2Thread("hello",&nbsp;100); &nbsp;&nbsp;tw2.join(); &nbsp;&nbsp;return&nbsp;0;}
打开App,查看更多内容
随时随地看视频慕课网APP