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, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk