int nreaders = 0; mutex mreaders; mutex mvalue; void do_write(…) { lock_guard lock(mvalue); perform write } foo_t do_read(…) { { lock_guard rlock(mreaders); nreaders++; if (nreaders==1) mvalue.lock(); } perform read and save in rv { lock_guard rlock(mreaders); nreaders--; if (nreaders==0) mvalue.unlock(); } return rv; }