2016-11-09 9 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> is Functor здесь, объект функции?

4> Что я здесь сделал в этом коде?!

+0

не должно это быть 'станд :: нить т (* FP) 'вместо этого? – vu1p3n0x

ответ

0

1> Выполняет ли std :: thread всегда оператор operator() внутри объекта при передаче по значению? Если да, то почему это было определено так.

std::thread вызывает std::invoke. Из cppreference, если первый аргумент не является ни pointer to member function, ни pointer to data member; он рассматривается как объект функции. Итак, вызывается fp().

ВЫЗОВ (е, t1, t2, ..., Tn) эквивалентно f (t1, t2, ..., Tn) (что есть, е является функциональный объект)

Таким образом, вы можете в основном сделать std::thread t{*fp}

2> как обеспечить, чтобы ресурс отдается нить остается вокруг до тех пор, как нить делает?

У вас может быть shared_ptr, чтобы предоставить право собственности на общий объект. Или вы можете просто сделать это вручную, гарантируя, что переданный ресурс находится в области видимости. Расстояние варьируется.

3> Функтор, написанный здесь, объект функции?

Да. Тип FunctionObject - это тип объекта, который можно использовать слева от оператора вызова функции. Однако fp нет. Но *fp есть.

4> Что я здесь сделал в этом коде?!

Вы можете заставить это работать, явно пропустив Functor::operator() с аргументом fp.get().Ofcourse простой способ, чтобы просто пройти *fp

Demo

+0

спасибо за ваш ответ @themagiacalyang, но вернувшись к 3> что является функтором в C++, я столкнулся с людьми, говорящими, что оператор, который определяет operator(), является функтором или функциональным объектом. 1> Мне нужно будет изучить это дальше, но я смог выполнить 'std :: thread ((Functor())), и он действительно выводит« Hello! »Без необходимости передавать оператор() явно. – 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; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^