c++ - 为什么从主线程调用时,`std::promise::set_value` 会抛出错误?
问题描述
当我运行以下代码时,
#include <future>
int main()
{
std::promise<int> p;
p.set_value(1);
return 0;
}
std::system_error
被抛出。但是,当我在另一个线程中设置承诺的值时,
#include <future>
#include <thread>
int main()
{
std::promise<int> p;
std::thread([&]{p.set_value(1);}).join();
return 0;
}
一切正常。据我了解std::promise
,调用set_value
不应该抛出异常,除非promise 没有共享状态(即它已被移出)或者已经为其分配了一个值,即使那样它也会抛出std::future_error
,而不是std::system_error
。由于没有数据竞争或类似的事情,我set_value
是从创建承诺的线程还是在另一个线程中调用都无关紧要。有什么我想念的吗?
我已经使用g++和clang进行了尝试,结果相同。具体来说,当我在顶部运行代码时,以下输出到stderr:
terminate called after throwing an instance of 'std::system_error'
what(): Unknown error -1
Aborted (core dumped)
这些命令用于编译顶部的代码,
g++ main_thread.cpp -o main_thread -std=c++17 -g -Og
clang main_thread.cpp -o main_thread -std=c++17 -lstdc++
这些用于编译底部的代码:
g++ separate_thread.cpp -o separate_thread -lpthread -std=c++17 -g -Og
clang separate_thread.cpp -o separate_thread -std=c++17 -lstdc++ -lpthread
解决方案
std::promise
是线程支持库的一部分,因此有理由认为它需要在您的编译器选项中启用线程支持(例如-pthread
)。
请注意,这-pthread
会影响编译和链接阶段。来自man g++
:
-pthread
通过 pthreads 库添加对多线程的支持。此选项为预处理器和链接器设置标志。
推荐阅读
- javascript - 如何减去这两个数组
- html - 如何用另一个属性的值替换一个属性值
- python - Python-Flask 无反应:活动一天后
- azure - 在 Azure 门户中,应用服务的模式是什么?
- javascript - 如何使用百分比随机获取数组中的元素来指定每个元素的可能性?
- c# - ASP.NET GridView 与标题列表
- php - Wordpress 永久链接更改后如何进行 301 重定向
- python - 将 DataFrame.sort_values 与来自 tkinter 条目的信息一起使用的问题
- plsql - ORACLE 18c XE (18.0.0.0.0) - MAX_STRING_SIZE = EXTENDED (COLLATE BINARY_CI) 问题
- php - php数组,过滤数组时出错且值不存在