Вы можете скопировать превосходный Sun ReentrantReadWriteLock . Он включает в себя такие функции, как необязательная справедливость, понижение уровня блокировки и, конечно, повторный вход.
Да, это на Java, но вы легко можете прочитать и перенести его на C ++, даже если вы не знаете Java. Документация, на которую я ссылался, содержит все поведенческие свойства этой реализации, поэтому вы можете быть уверены, что она делает то, что вам нужно.
Если ничего другого, это руководство.