You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的同步组件支持不完善,或者环境配置异常导致的模糊错误。

解决方案

  1. 更换编译环境:使用本地较新版本的编译器(如GCC 12+、Clang 14+)编译运行,这类版本的标准库已修复多数C++20相关的future实现bug。
  2. 替代方案:如果必须在当前环境运行,可改用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 00:10:21