std :: system_error的原因

时间:2019-02-14 18:07:35

标签: c++

由于负责将任务提交给池本身的功能模板存在问题,我编写线程池实现的尝试已停滞。

我已将代码简化为最基本的组成部分:创建一个std::promise对象,对其进行赋值,然后返回其std::future对象,但仍然出现错误。

#include<future>
#include<iostream>

template<typename Func, typename Ret>
void set(std::promise<Ret> & promise, Func && func) {
    promise.set_value(func());
}

template<typename Func>
void set(std::promise<void> & promise, Func && func) {
    func();
    promise.set_value();
}

template<typename Func, typename ... Args>
auto execute(Func && func, Args && ... args) ->
std::future<decltype(func(args...))> {
    using Ret = decltype(func(args...));
    std::promise<Ret> promise;
    set(promise, [&]{return func(std::forward<Args>(args)...);});
    return promise.get_future();
}

void reverse(std::string & string) {
    for(size_t i = 0; i < string.size() / 2; i++)
        std::swap(string[i], string[string.size() - 1 - i]);
}

int main() {
    try{
        std::string string = "Hello World!";
        auto future2 = execute(reverse, string);
        future2.get();
        std::cout << string << std::endl;
    } catch(std::system_error const& e) {
         std::cerr << e.what() << std::endl;
         std::cerr << e.code() << std::endl;
    }
}

控制台输出:

Unknown Error: -1
generic: -1

通过调试,该错误似乎恰好在我对set_value对象调用promise的那一刻发生;我在做什么错了?

1 个答案:

答案 0 :(得分:0)

由于未知原因,此错误似乎是由于未包含GCC的线程库pthread引起的。通过添加-pthread标志来编译程序会导致错误消失。