第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用成員函數(shù)啟動線程

使用成員函數(shù)啟動線程

C++ C
長風秋雁 2019-05-29 17:14:54
使用成員函數(shù)啟動線程我試圖std::thread用一個不帶參數(shù)和返回的成員函數(shù)構(gòu)造一個void。我無法弄清楚任何有效的語法 - 編譯器無論如何都會抱怨。實現(xiàn)的正確方法是什么,spawn()以便返回std::thread執(zhí)行的test()?#include <thread>class blub {   void test() {   }public:   std::thread spawn() {     return { test };   }};
查看完整描述

4 回答

?
哈士奇WWW

TA貢獻1799條經(jīng)驗 獲得超6個贊

#include <thread>#include <iostream>class bar {public:
  void foo() {
    std::cout << "hello from member function" << std::endl;
  }};int main(){
  std::thread t(&bar::foo, bar());
  t.join();}

編輯:計算你的編輯,你必須這樣做:

  std::thread spawn() {
    return std::thread(&blub::test, this);
  }

更新:我想解釋一些問題,其中一些也在評論中討論過。

上述語法是根據(jù)INVOKE定義(第20.8.2.1節(jié))定義的:

定義INVOKE(f,t1,t2,...,tN)如下:

  • (t1。* f)(t2,...,tN)當f是指向類T的成員函數(shù)的指針時,t1是類型為T的對象或?qū)︻愋蜑門的對象的引用或?qū)︻愋蚑的引用源自T的類型的對象;

  • ((* t1)。* f)(t2,...,tN)當f是指向類T的成員函數(shù)的指針時,t1不是前一項中描述的類型之一;

  • t1。* f當N == 1且f是指向類T的成員數(shù)據(jù)的指針時,t 1是類型T 
    的對象或?qū)︻愋蜑門的對象的引用或?qū)闹?br/>派生的類型的對象的引用噸;

  • (* t1)。* f當N == 1且f是指向類T的成員數(shù)據(jù)的指針時,t 1不是前一項中描述的類型之一;

  • f(t1,t2,...,tN)在所有其他情況下。


我要指出的另一個一般事實是,默認情況下,線程構(gòu)造函數(shù)將復制傳遞給它的所有參數(shù)。原因是參數(shù)可能需要比調(diào)用線程更長,復制參數(shù)保證了這一點。相反,如果您想真正傳遞引用,則可以使用std::reference_wrapper創(chuàng)建的std::ref。

std::thread (foo, std::ref(arg1));

通過這樣做,您承諾在線程對它們進行操作時,您將保證參數(shù)仍然存在。


請注意,上面提到的所有內(nèi)容也可以應用于std::asyncstd::bind。


查看完整回答
反對 回復 2019-05-29
?
月關寶盒

TA貢獻1772條經(jīng)驗 獲得超5個贊

由于您使用的是C ++ 11,因此lambda-expression是一個很好的清潔解決方案。

class blub {
    void test() {}
  public:
    std::thread spawn() {
      return std::thread( [this] { this->test(); } );
    }};

因為this->可以省略,它可以縮短為:

std::thread( [this] { test(); } )

要不就

std::thread( [=] { test(); } )


查看完整回答
反對 回復 2019-05-29
?
慕運維8079593

TA貢獻1876條經(jīng)驗 獲得超5個贊

@ hop5和@RnMss建議使用C ++ 11 lambdas,但是如果你處理指針,你可以直接使用它們:

#include <thread>#include <iostream>class CFoo {
  public:
    int m_i = 0;
    void bar() {
      ++m_i;
    }};int main() {
  CFoo foo;
  std::thread t1(&CFoo::bar, &foo);
  t1.join();
  std::thread t2(&CFoo::bar, &foo);
  t2.join();
  std::cout << foo.m_i << std::endl;
  return 0;}

輸出

2

這個答案重寫的樣本將是:

#include <thread>#include <iostream>class Wrapper {
  public:
      void member1() {
          std::cout << "i am member1" << std::endl;
      }
      void member2(const char *arg1, unsigned arg2) {
          std::cout << "i am member2 and my first arg is (" << arg1 << ") and second arg is (" << arg2 << ")" << std::endl;
      }
      std::thread member1Thread() {
          return std::thread(&Wrapper::member1, this);
      }
      std::thread member2Thread(const char *arg1, unsigned arg2) {
          return std::thread(&Wrapper::member2, this, arg1, arg2);
      }};int main() {
  Wrapper *w = new Wrapper();
  std::thread tw1 = w->member1Thread();
  tw1.join();
  std::thread tw2 = w->member2Thread("hello", 100);
  tw2.join();
  return 0;}


查看完整回答
反對 回復 2019-05-29
  • 4 回答
  • 0 關注
  • 797 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號