关于线程返回值std::future的疑问

一叶小舟_郭 2020-11-20 03:27:41

#include <list>
#include <thread>

using namespace std;
struct Data
{
int from;
int to;
long long sum;
};
Data sum(int from, int to)
{
Data s;
while(true)
{
s.from = from;
s.to = to;
s.sum = 0;
for(int i = from; i <= to; i++)
{
s.sum += i;
}
for(int i = to; i >= (to+from)/2; i--)
{
s.sum -= i;
}
}

//printf("%d+...+%d-%d...-%d=%lld\n", s.from, s.to, s.to, (s.to+from)/2, s.sum);
//this_thread::sleep_for(std::chrono::milliseconds(50));
return s;
}


int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);

std::future<Data> retData = std::async(std::bind(&sum, 20, 100000));
while(!retData.valid())
{
continue;
}
cout<<"Data Reday"<<endl;
Data r = retData.get();
cout<<"from:"<<r.from<<" to:"<<r.to<<" result:"<<r.sum<<endl;
return 0;
}

本人在使用future时,发现future的valid值有问题,明明我这代码有无限循环,结果检查值时valid返回true,导致在控制台打出来了,然后再get地方等,这很明显不对,
我其实是在使用线程池的时候发现这个问题,我在主线程检查future时,以为值准备好了,结果锁在等值的地方,其他该做的事情没做,请大神解释一下错误的地方以及正确使用方法,谢谢
本人使用IDE:5.9.3+vc2015 x86
...全文
201 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
一叶小舟_郭 2020-11-23
  • 打赏
  • 举报
回复
引用 2 楼 qq_40162781 的回复:
如果想要循环检查可以使用wait_for()或者wait_until()指定一个超时时间,然后判断返回值是超时还是准备好了
OK, 我用上面的例子测试了一下,可以,我看了内部代码,我猜测valid只是表示这个future设置了初始公式? 那是我函数理解错误了,学习了,谢谢.
qq_40162781 2020-11-23
  • 打赏
  • 举报
回复
如果想要循环检查可以使用wait_for()或者wait_until()指定一个超时时间,然后判断返回值是超时还是准备好了
qq_40162781 2020-11-23
  • 打赏
  • 举报
回复
检查值准备好没应该使用future.wait

64,652

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧