4 回答

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::async
和std::bind
。

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(); } )

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;}
- 4 回答
- 0 關注
- 797 瀏覽
添加回答
舉報