#include <iostream>
#include <mutex>
using namespace std;
class A;
class B {
public:
  B(A *_parent = nullptr) {
    parent = _parent;
  }
  A *parent;
};
class A {
public:
  std::mutex m;
  B *b;
  A() {
    b = new B(this);
  }
};
int main() {
  A a_obj;
  B *b = new B(&a_obj);
  //b->parent->m.lock();
  return 0;
}
I believe the composed objects above function as expected and I've been using a similar design (my A creates B's and adds them to a data structure. The B's are constructed with references to their parent.)
When I tried to add threadsafe message-passing between A's and B's, the program crashed whenever a B tried to use a threadsafe container in A.
The code above recreates the problem. Why can B not acquire A's mutex?