Boost logo

Boost :

From: Achilleas Margaritis (axilmar_at_[hidden])
Date: 2007-12-01 19:43:00


Isn't there a deadlock issue with futures? suppose I have the following
code:

class A {
     int data;

public:
     int getData() const {
         return data;
     }

     void someAction(B *b) {
         future<int> i = bind(b, &B::someAction, this);
         data = i.wait() + 1;
     }
};

class B {
     int data;

public:
     int someAction(A *a) {
         future<int> j = bind(a, &A::getData);
         return j.wait() + 1;
     }
};

int main() {
      A *a = new A;
      B *b = new B;
      a->someAction(b);
}

The above contains a deadlock:

class A builds a future 'i' in function 'someAction' over class B, then
it waits for B's method 'someAction' to wait.

class B, when its method 'someAction' is invoked, builds a future 'j'
over method 'getData' of A...then it tries to evaluate 'j'.

At this point, the instance of A is blocked waiting for B to finish its
processing, and B waits for A to finish its processing, thus deadlocking
the program.

My question is: is this a real problem, and if so, how is it handled by
boost::futures?

Another way to introduce the deadlock is by mutual recursion using futures.


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk