lundi 26 mars 2018

Forcibly terminate method after a certain amount of time

Say I have a function whose prototype looks like this, belonging to class container_class:

std::vector<int> container_class::func(int param);

The function may or may not cause an infinite loop on certain inputs; it is impossible to tell which inputs will cause a success and which will cause an infinite loop. The function is in a library of which I do not have the source of and cannot modify (this is a bug and will be fixed in the next release in a few months, but for now I need a way to work around it), so solutions which modify the function or class will not work.

I've tried isolating the function using std::async and std::future, and using a while loop the constantly check the state of the thread:

container_class c();

long start = get_current_time(); //get the current time in ms
auto future = std::async(&container_class::func, &c, 2);

while(future.wait_for(0ms) != std::future_status::ready) {
    if(get_current_time() - start > 1000) {
        //forcibly terminate future
    }

    sleep(2);
}

This code has many problems; one is that I can't forcibly terminate the std::future object.

At the far extreme, if I can't find any other solution, I can isolate the function in its own executable, run it, and then check its state and terminate it appropriately. However, I would rather not do this.

How can I accomplish this? Is there a better way than what I'm doing right now?

Aucun commentaire:

Enregistrer un commentaire