C ++ - Boost.Promise, Boost.Unique_Future и Move Semantics - PullRequest
3 голосов
/ 10 января 2012

Я следую некоторым урокам Бартоша Милевского здесь , которые я считаю очень полезными.Тем не менее, поскольку автор использует just :: thread реализацию стандарта потоков C ++ 11 (которого у меня еще нет), я решил пока использовать потоки повышения, как автораучебник говорит, что это тривиально, чтобы сделать это.Это похоже на первые три урока в серии, но я столкнулся с некоторыми проблемами с четвертым.Вот мой код:

#include <iostream>
#include <cassert>
#include <boost\thread.hpp>
#include <boost\thread\future.hpp>

void thFun(boost::promise<std::string> & prms)
{
    std::string str("Hi from future!");
    prms.set_value(str);
}

int main()
{
    boost::promise<std::string> prms;
    boost::unique_future<std::string> fut = prms.get_future();

    boost::thread th(&thFun, std::move(prms)); // error C2248: 'boost::promise<R>::promise' : cannot access private member declared in class 'boost::promise<R>' 

    std::cout << "Hi from main!";
    std::string str = fut.get();
    std::cout << str << std::endl;
    th.join();

    return 0;
}

Следующая строка вызывает проблему, которую я не понимаю:

boost::thread th(&thFun, std::move(prms));

, когда компилятор жалуется:

ошибка C2248: «boost :: обещание :: обещание»: невозможно получить доступ к закрытому члену, объявленному в классе «boost :: обещание»

Кто-нибудь может подсказать, в чем может быть проблема?1018 * спасибо заранее!

1 Ответ

7 голосов
/ 10 января 2012

boost::thread использует boost::bind для обработки функции потока с дополнительными аргументами, что требует их копирования.Вы можете передать обещание указателем или ссылкой (используя, например, boost::ref), но для этого требуется, чтобы объект пережил поток.В этом примере все в порядке, но для отдельного потока или для того, который переживает функцию, которая его запустила, это предотвратит использование boost::promise объектов в стеке.

...