c++线程池std::promise和函数类型错误

Posted

技术标签:

【中文标题】c++线程池std::promise和函数类型错误【英文标题】:c++ Thread pool std::promise and function type error 【发布时间】:2021-11-13 18:27:51 【问题描述】:

我尝试编写自己的线程池版本,但行数有问题

            template <typename F, typename...Args>
    auto addWork(F&& f, Args&&... args) -> std::future<decltype (f(args...))>
    
        using ReturnType = decltype(f(args...));
            //...
            result.set_value(f(args...));
            std::promise<ReturnType> result;
            result.set_value(f(args...));
            return result.get_future();
            //...

除了 f 没有参数或为 void 类型时,一切似乎都有效。我不知道如何让“set_value()”工作。

感谢阅读。

【问题讨论】:

【参考方案1】:

如果您的ReturnTypevoid,则您的std::promise&lt;ReturnType&gt; result 变量是一个特化-std::promise&lt;void&gt;。它的set_value(4) 方法不接受任何参数。

要解决此问题,您可以使用if constexpr 检查您是否正在处理涉及返回void 的函数的特殊情况。简单地改变这个:

std::promise<ReturnType> result;
result.set_value(f(args...));
return result.get_future();

到这里:

std::promise<ReturnType> result;
if constexpr (std::is_same_v<ReturnType, void>) 
    f(args...);
    result.set_value();
 else 
    result.set_value(f(args...));

return result.get_future();

【讨论】:

以上是关于c++线程池std::promise和函数类型错误的主要内容,如果未能解决你的问题,请参考以下文章

c++ 中的 std::promise 和 std::future

C++ 线程

C++ std::future与promise(异步回调异步调用)

C++ std::future与promise(异步回调异步调用)

为啥从主线程调用时,`std::promise::set_value` 会抛出错误?

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