Read and write locks

{
  vip_t::readlock r(vip);

  foo(r->n);
}

{
  vip_t::writelock w(vip);

  w->n=4;
}

Read and write locks implement the typical ways of accessing a very important object. As mentioned before, x::vipobj is lightweight, and not reference- counted. Neither are these, and other kinds of locks. The underlying very important object must remain in scope as long as any of its outstanding locks remain in existence (their destructors release internal locks within the very important object).

The x::vipobj::readlock resolves to a constant value of the very important object, and x::vipobj::writelock predictably resolves to a mutable value. Both locks implement the * and -> operators that resolve to the very important object's value.

Naturally, multiple x::vipobj::readlocks may exist concurrently, but only one x::vipobj::writelock at a time, which blocks other x::vipobj::writelocks and other x::vipobj::readlocks. A x::vipobj::writelock does not invoke the registered notification callbacks. Acquiring, using, and releasing read and write locks merely provide a means for modifications to the underlying very important object; and are not reportable to notification handlers.