C++20单线程使用std::future与std::promise触发异常问题
单线程C++20中std::promise::set_value触发std::system_error(-1)的问题
问题描述
在C++20单线程环境下,使用std::promise和std::future时,调用prom.set_value(111)会抛出std::system_error,异常信息如下:
terminate called after throwing an instance of 'std::system_error' what(): Unknown error -1
测试代码:
#include <future> #include <iostream> int main() { std::promise<int> prom; std::future<int> fut = prom.get_future(); std::cout << "1 ok" << std::endl; prom.set_value(111); std::cout << "2 ok" << std::endl; std::cout << fut.get() << std::endl; return 0; }
原因分析
这段代码完全符合C标准规范:先调用get_future()获取关联的std::future,再调用set_value()设置结果,且仅调用一次set_value(),单线程下不存在竞态条件。出现该异常是在线编译环境的标准库实现存在缺陷,大概率是其使用的libstdc/libc对C20 futures的同步组件支持不完善,或者环境配置异常导致的模糊错误。
解决方案
- 更换编译环境:使用本地较新版本的编译器(如GCC 12+、Clang 14+)编译运行,这类版本的标准库已修复多数C++20相关的future实现bug。
- 替代方案:如果必须在当前环境运行,可改用
std::packaged_task实现相同逻辑,示例代码如下:
#include <future> #include <iostream> #include <functional> int main() { std::packaged_task<int()> task([](){ return 111; }); std::future<int> fut = task.get_future(); std::cout << "1 ok" << std::endl; task(); // 执行任务自动设置结果 std::cout << "2 ok" << std::endl; std::cout << fut.get() << std::endl; return 0; }
内容的提问来源于stack exchange,提问作者GOGO
相关产品推荐
相关产品推荐

