C ++线程和承诺:尝试引用已删除的函数

时间:2016-05-18 12:20:41

标签: c++ multithreading promise future

我在运行这个网上找到的例子时遇到了一些麻烦。

void asyncFun(std::promise<int> intPromise) {
    int result=5;
    try {
        // calculate the result
        intPromise.set_value(result);
    }
    catch (...) {
        intPromise.set_exception(std::current_exception());
    } 
}

int _tmain(int argc, _TCHAR* argv[]) {
    std::promise<int> intPromise;
    std::future<int> intFuture = intPromise.get_future();
    std::thread t(asyncFun, std::move(intPromise));
    std::cout << "Main thread" << std::endl;
    int result = intFuture.get(); // may throw MyException
    std::cout << result<<std::endl;
    return 0;
}

我得到了:

  

错误C2280:'std :: promise :: promise(const   std :: promise&amp;)':尝试引用已删除的   功能c:\ program files(x86)\ microsoft visual studio   12.0 \ vc \ include \ functional 1149 1 tryFuture

1 个答案:

答案 0 :(得分:2)

这是您正在使用的实施中的错误。如果可以,请考虑升级。

std::thread的参数必须为MoveConstructiblestd::promise满足这些要求。

它在http://webcompiler.cloudapp.net在线编译并运行(t.join()中添加了main。作为解决方法,您可以考虑“提供”引用(使用std::ref并从promise移动),但要警告悬挂引用以及此类解决方法。

此处的另一个解决方法是使用std::shared_ptr并将std::promise作为函数的参数。

void asyncFun(std::shared_ptr<std::promise<int>> intPromise) {
    int result=5;
    try {
        // calculate the result
        intPromise->set_value(result);
    }
    catch (...) {
        intPromise->set_exception(std::current_exception());
    } 
}

int main() {
    std::promise<int> intPromise;
    std::future<int> intFuture = intPromise.get_future();
    auto sh = std::make_shared<std::promise<int>>(std::move(intPromise));
    std::thread t(asyncFun, sh);
    std::cout << "Main thread" << std::endl;
    int result = intFuture.get(); // may throw MyException
    std::cout << result<<std::endl;
    t.join();
    return 0;
}