標籤:

C++中如何將函數調用轉發至另一個線程?

現在有這樣一段代碼,如何才能使函數func接受問題中的lambda和foo?

問題更新一下

// ----------------------------------------

#include &

#include &

void foo() {

std::cout&<&<"---"&<&

}

template&

void func1(Function f, Args ...args) {

f(args...);

}

template&

void func(Function f, Args ...args) {

std::thread(func1&, std::ref(f), std::forward&(args)...);

}

int main(int argc, char * argv[]) {

auto lambda = []() -&> void {

std::cout&<&<"..."&<&

};

func(lambda); //正確

//如果將lambda表達式直接寫在func的參數內,即

//func([]() -&>void {std::cout&<&<"lambda_in_argument"&<&

//會導致編譯不過,但是如果直接在std::thread中直接將lambda表達式傳入參

//數就不會有問題,怎麼樣修改才能使的上面這種寫法正確運行呢?

func(foo); //正確

return 0;

}

// -----------------------------------


首先,你std::ref進去是不行的,變數都已經釋放了,你還去訪問,妥妥地GG。

其次,錯誤的地方在於,func(lambda)進去的是左值引用,func([](){})進去的是右值引用,所以你要這麼改:

template&
void func(Function f, Args ...args)
{
std::thread(func1&, std::ref(f), std::forward&(args)...);
}


不知道行不行,其實我也不會(在評論中發了好幾次,都失敗,只能發這兒了)

#include &

#include &

#include &

void foo() {

std::cout &<&< "---" &<&< std::endl;

}

template&

void func1(Function f, Args ...args) {

f(args...);

}

template&

std::thread func(Function f, Args ...args) {

return std::thread(func1&, Args...&>, f, std::forward&(args)...);

}

int main( void )

{

auto lambda = []() -&> void {

std::cout &<&< "..." &<&< std::endl;

};

auto a = func(lambda);

auto b = func( std::function&(foo) );

auto c = func([](){std::cout&<&<"|||"&<&

a.join();

b.join();

c.join();

}


推薦閱讀:

互斥鎖,同步鎖,臨界區,互斥量,信號量,自旋鎖之間聯繫是什麼?
C# 如何在調用控制項時做到 Thread-safe(線程安全)?
多線程是否有意義?
boost 是否像 Linux 一樣提供讀寫自旋鎖機制?

TAG:C | 多線程 |