木木em哈哈 2023-10-25 12:54 采纳率: 0%
浏览 7

关于#c++#的问题:写的是创建两个线程,末尾设定值#include <iostream>

写的是创建两个线程,末尾设定值

#include <iostream>
#include <vector>
#include <future>
#include <thread>
using namespace std;
int F_1(future<int>& sum_1) {
    this_thread::sleep_for(chrono::seconds(sum_1.get()));
    return 0;
}
int main() {
    vector<future<int>> futs;
    vector<promise<int>> pros;
    vector<future<int>> futs_0;
    for (int i = 0; i < 2; i++) {
        promise<int> pro_1;
        pros.emplace_back(move(pro_1));
        futs_0.emplace_back(move(pros[i].get_future()));
        auto it = async(launch::async | launch::deferred, F_1, ref(futs_0[i]));
        futs.emplace_back(move(it));
    }
    pros[0].set_value(1);
    pros[1].set_value(2);
}

报错

img

但是这一段代码没错,我改一下代码——把其中的future容器删去了又可以跑了


```c++
#include <iostream>
#include <vector>
#include <future>
#include <thread>
using namespace std;
int F_1(future<int>& sum_1) {
    this_thread::sleep_for(chrono::seconds(sum_1.get()));
    return 0;
}
int main() {
    vector<future<int>> futs;
    vector<promise<int>> pros;
    vector<future<int>> futs_0;
    for (int i = 0; i < 2; i++) {
        promise<int> pro_1;
        pros.emplace_back(move(pro_1));
        //这中间变了
        future<int> fut_0=pros[i].get_future();
        auto it = async(launch::async | launch::deferred, F_1, ref(fut_0));
        //这中间变了
        futs.emplace_back(move(it));
    }
    pros[0].set_value(1);
    pros[1].set_value(2);
}

我想问问为什么我之前的那个会报错

  • 写回答

2条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-10-25 14:55
    关注

    【以下回答由 GPT 生成】

    这个问题的原因是,在第一个例子中,你在futs_0容器中存储了pros[i].get_future()的值,并将其作为参数传递给F_1函数。但是,在这之后,你将pros向量中的promise对象移动到了futs向量中,这导致了futs_0向量中的future对象无效。因此,在调用F_1函数时,试图访问无效的future对象时会出错。

    要解决这个问题,你可以使用一个向量来存储异步任务的返回值,而不是future容器。然后,将promise对象移动到该向量中,以确保不会出现无效的future对象。以下是修改后的代码:

    #include <iostream>
    #include <vector>
    #include <future>
    #include <thread>
    using namespace std;
    
    int F_1(future<int>& sum_1) {
        this_thread::sleep_for(chrono::seconds(sum_1.get()));
        return 0;
    }
    
    int main() {
        vector<int> results; // 存储异步任务的返回值
        vector<promise<int>> pros;
        for (int i = 0; i < 2; i++) {
            promise<int> pro_1;
            pros.emplace_back(move(pro_1));
            auto it = async(launch::async | launch::deferred, F_1, ref(pros[i].get_future()));
            results.push_back(it.get()); // 将异步任务的返回值存储到results向量中
        }
        pros[0].set_value(1);
        pros[1].set_value(2);
    }
    

    这样修改后的代码应该能够正常运行,并且不会报错了。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 修改了问题 10月25日
  • 创建了问题 10月25日

悬赏问题

  • ¥15 django5安装失败
  • ¥15 Java与Hbase相关问题
  • ¥15 ANSYS分析简单钎焊问题
  • ¥20 bash代码推送不上去 git fetch origin master #失败了
  • ¥15 LOL外服加入了反作弊系统,现在游戏录像rofl文件离线都无法打开
  • ¥15 在centos7安装conda
  • ¥15 c#调用yolo3 dll文件获取的数据对不上
  • ¥20 WPF 如何实现多语言,label 和cs(live Charts)中是否都能翻译
  • ¥15 STM32F103上电短路问题
  • ¥15 打开软件提示错误:failed to get wglChoosePixelFormatARB