Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

'future' has been explicitly marked deleted here

I am trying to build a Async application to allow processing of large lists in parallel, and after two days of learning C++ through googling I have come up with the title error, from the following code:

//
//  main.cpp
//  ThreadedLearning
//
//  Created by Andy Kirk on 19/01/2016.
//  Copyright © 2016 Andy Kirk. All rights reserved.
//

#include <iostream>
#include <thread>
#include <vector>
#include <chrono>
#include <future>

typedef struct {
    long    mailing_id;
    char    emailAddress[100];
} emailStruct ;

typedef struct {
    long    mailing_id = 0;
    int     result = 0;
} returnValues;

returnValues work(emailStruct eMail) {

    returnValues result;

    std::this_thread::sleep_for(std::chrono::seconds(2));

    result.mailing_id = eMail.mailing_id;

    return result;
}

int main(int argc, const char * argv[]) {

    std::vector<emailStruct>    Emails;
    emailStruct eMail;

    // Create a Dummy Structure Vector
    for (int i = 0 ; i < 100 ; ++i) {
        std::snprintf(eMail.emailAddress,sizeof(eMail.emailAddress),"user-%d@email_domain.tld",i);
        eMail.mailing_id = i;
        Emails.push_back(eMail);
    }


    std::vector<std::future<returnValues>> workers;

    int worker_count = 0;
    int max_workers  = 11;


    for ( ; worker_count < Emails.size(); worker_count += max_workers ){

        workers.clear();

        for (int inner_count = 0 ; inner_count < max_workers ; ++inner_count) {
            int entry = worker_count + inner_count;
            if(entry < Emails.size()) {
                emailStruct workItem = Emails[entry];
                auto fut = std::async(&work, workItem);
                workers.push_back(fut);
            }
        }

        std::for_each(workers.begin(), workers.end(), [](std::future<returnValues> & res) {
            res.get();
        });

    }

    return 0;
}

Really not sure what I am doing wrong, and have found limited answers searching. Its on OSX 10 if that is relevant, and XCode 7.

like image 473
Perception Avatar asked Apr 08 '26 05:04

Perception


1 Answers

The future class has its copy constructor deleted, because you really don't want to have multiple copies of it.

To add it to the vector, you have to move it instead of copying it:

workers.push_back(std::move(fut));
like image 188
Bo Persson Avatar answered Apr 09 '26 20:04

Bo Persson