2016-11-09 828 views
0

只要我的線程執行,就需要使用此Functor,所以我創建了一個shared_ptr並試圖將它傳遞給std :: thread 。我在這裏複製了代碼和錯誤列表。將std :: shared_ptr傳遞給std :: thread的函數對象

struct Functor 
{ 
    std::string greeting; 
    explicit Functor(std::string _greeting="Hello!"): greeting { _greeting }  {} 
    void operator()() 
    { 
     std::cout << greeting << "\n"; 
    } 
}; 

auto main() ->int 
{ 
    std::shared_ptr<Functor> fp = std::make_shared<Functor>(); 
    std::thread t(&fp); 
    t.join(); 
    return 0; 
} 

錯誤列表:

Error C2893 Failed to specialize function template 'unknown-type std::invoke(_Callable &&,_Types &&...)' std_threads C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\thr\xthread 240 
Error C2672 'std::invoke': no matching overloaded function found std_threads C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\thr\xthread 240 

我是新的C++ 11和併發性。請幫我理解以下內容

1> std :: thread是否在值傳遞時始終調用對象內的operator()?如果是這樣,爲什麼這樣定義。

2>如何確保給線程的資源一直保持在線程中?

3>是函子這裏寫的函數對象?

4>在這段代碼中我做了什麼?

+0

應該不會是'的std ::線程t(* FP) 「而不是? – vu1p3n0x

回答

0

1> std :: thread在值傳遞時總是調用對象 中的operator()嗎?如果是這樣,爲什麼這樣定義。

std::thread調用std::invoke。從cppreference,如果第一個參數既不是pointer to member function也不是pointer to data member;它被視爲一個函數對象。 因此,fp()將被調用。

INVOKE(F,T1,T2,...,TN)是等效至f(T1,T2,...,TN)(即 是,f爲函數對象)

這樣你就可以基本上做到std::thread t{*fp}

2>如何保證給線程的資源總是在那裏,只要 的線程呢?

您可以讓shared_ptr提供共享對象的所有權。或者,您可以通過確保傳遞的資源在範圍內手動執行此操作。里程不一。

3>是這裏寫的Functor函數對象嗎?

是的。 FunctionObject類型是可以在函數調用操作符左側使用的對象的類型。但fp不是。但*fp是。

4>我在這裏做了什麼代碼?!

您可以通過明確地傳遞Functor::operator()與參數fp.get()使其工作。Ofcourse一個簡單的方法是隻通過*fp

Demo

+0

感謝您的回答@themagiacalyang,但回到3>什麼是C++中的函子,我遇到過人們說定義operator()的對象是一個函子或函數對象。 1>我需要進一步探索,但是我能夠執行'std :: thread((Functor()))'它確實打印'Hello!'而不必顯式傳遞operator()。 – user3222

+0

@ user3222是的。該演示僅供參考,如何顯式傳遞'operator()'。 'Functor()'作爲一個函數對象。簡而言之,f是一個函數對象,如果你可以對它做f(...),其中...是參數。 – themagicalyang

0

std::shared_ptr<Functor>不是調用 - 它沒有實現operator(),即使Functor一樣。

shared_ptr這裏的目的是什麼?爲什麼不乾脆

int main() { 
    Functor f; 
    std::thread t(std::ref(f)); 
    t.join(); 
    return 0; 
} 

如果由於某種原因,你堅持有Functor例如通過shared_ptr管理,這裏有一個方法:

int main() { 
    std::shared_ptr<Functor> fp = std::make_shared<Functor>(); 
    std::thread t([fp]() { (*fp)(); }); 
    t.join(); 
    return 0; 
} 
相關問題