Эта функция не является поточно-ориентированной, поскольку приводит к неопределенному поведению. Когда вы пытаетесь получить блокировку записи, вы уже удерживаете блокировку чтения. С документация для pthread_rwlock_wrlock
:
Результаты не определены, если вызывающий поток удерживает блокировку чтения-записи (будь то блокировку чтения или записи) во время вызова [to pthread_rwlock_wrlock
].
Это решение также не является безопасным для исключений. Если во время удержания блокировки выдается исключение, блокировка не будет снята, и ваше приложение, несомненно, будет заблокировано. Вы должны использовать библиотеку потоков C ++ (Boost.Thread, OpenThreads, just :: thread или что-то подобное), которая предоставляет C ++-ориентированный дизайн, поддерживающий такие вещи, как scoped_lock
(или lock_guard
).
Что касается правильного алгоритма, вам нужно что-то вроде:
obtain read lock
attempt to find object
if object exists
return object
else
release read lock
obtain write lock
if object exists
return object
else
insert object
return object
[Если вы используете какой-то lock_guard
, вам не нужно беспокоиться об освобождении удерживаемых блокировок при возврате]