由于负责将任务提交给池本身的功能模板存在问题,我编写线程池实现的尝试已停滞。
我已将代码简化为最基本的组成部分:创建一个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
的那一刻发生;我在做什么错了?
答案 0 :(得分:0)
由于未知原因,此错误似乎是由于未包含GCC的线程库pthread
引起的。通过添加-pthread
标志来编译程序会导致错误消失。