Я не знаю ничего на 100% похожего на ваше предложение, но есть некоторые близкие интерфейсы:
Многие существующие API блокировки r / w имеют интерфейс «try lock», как pthread_rwlock_trywrlock()
в системах UN * X. Они не требуют ожидания и получат блокировку только в том случае, если никто не владеет ею и не ждет ее уже.
Обычно вы используете это вращение для блокировки и / или искусственной задержки кода проб (откат). То есть иметь код как:
for (count = 0; count < MAX_SPINS && (locked = trywrlock(lock)); count++);
if (locked) {
delay(some_backoff);
wrlock(lock); /* or try spinning loop above again ? */
}
К сожалению, это не совсем то, что вы просите; он получит блокировку поздно, но записывающее устройство с низким уровнем приора будет вращаться на процессоре и / или получит его с задержкой из-за (возможно, ненужного) отката.
Ядро Solaris имеет интерфейс rw_tryupgrade(9f)
, который можно использовать для проверки, является ли текущий поток единственным считывающим устройством в блокировке без ожидающего записи, и, если это так, обновите блокировку до эксклюзивной / записи то есть вы бы набрали код:
if (!rw_tryenter(lock, RW_WRITER)) {
rw_enter(lock, RW_READER); /* this might wait for a writer */
if (!rw_tryupgrade(lock)) { /* this fails if >1 reader / writer waiting */
/* do what you must to if you couldn't get in immediately */
}
}
Что немного ближе к тому, что вы просите, но все же не совсем то же самое - в случае сбоя вам придется сбросить блокировку чтения, возможно, снова отключить (подождать), повторно получить блокировку чтения, попытаться обновить. Этот процесс снова сводится к вращению.
Кроме того, многие системы UNIX, по крайней мере, фактически выполняют пробуждения официантов в порядке приоритета планирования; так что вам придется сделать ваш поток с самым низким приоритетом (если это необходимо, искусственно) перед попыткой обычного, ожидающего вызова wrlock()
; тот, кто еще захочет такую же блокировку записи, пока ваш поток ожидает, получит ее до этого благодаря тому, как работает планировщик. Хотя в многопроцессорных / базовых системах это не обязательно гарантировано ...
Наконец, SymbianOS (версия Symbian ^ 3) имеет класс RRWlock
, который может быть сделан для определения приоритетов читателей по сравнению с писателями, так что он будет сознательно голодать писателей, если читатели ждут / входят. Опять же, не совсем точно нужное вам поведение, так как оно влияет на всех писателей данной блокировки, а не только на конкретную.
Боюсь, вам придется написать свой собственный приоритетный замок с двумя очередями пробуждения писателя.