C++ - Boost.Promise,Boost.Unique_Future和Move Semantics

Pat*_*ard 3 c++ multithreading boost move-semantics

我继巴尔托什卢斯基一些教程,这里我觉得这是非常有用的.但是,由于作者使用了C++ 11线程标准的just :: thread实现(我还没有),我现在决定使用boost线程,因为该教程的作者说它很简单.这样做.这似乎是本系列前三个教程的情况,但我遇到了第四个问题.这是我的代码:

#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;
}
Run Code Online (Sandbox Code Playgroud)

以下行似乎引发了一个我不明白的问题:

boost::thread th(&thFun, std::move(prms));
Run Code Online (Sandbox Code Playgroud)

编译器抱怨的地方:

错误C2248:'boost :: promise :: promise':无法访问类'boost :: promise'中声明的私有成员

任何人都可以建议问题可能是什么?

提前致谢!

Ant*_*ams 7

boost::thread用于boost::bind处理带有附加参数的线程函数,这要求它们是可复制的.您可以通过指针或引用传递promise(使用eg boost::ref),但这需要该对象超过该线程.在这个例子中它是可以的,但是对于一个分离的线程,或一个比启动它的函数更长的线程,这将阻止boost::promise在堆栈上使用对象.