Одно использование переменных условий, которые немного сложнее, чем просто очередь сообщений, заключается в «совместном использовании блокировки», где разные потоки ожидают тонко отличающихся условий одного и того же основного характера. Например, у вас есть (очень шонкий, упрощенный) веб-кеш. Каждая запись в кеше имеет три возможных состояния: нет, IN_PROGRESS, COMPLETE.
getURL:
lock the cache
three cases for the key:
not present:
add it (IN_PROGRESS)
release the lock
fetch the URL
take the lock
update to COMPLETE and store the data
broadcast the condition variable
goto COMPLETE
COMPLETE:
release the lock and return the data
IN_PROGRESS:
while (still IN_PROGRESS):
wait on the condition variable
goto COMPLETE
У меня на практике использовал шаблон для реализации варианта функции POSIX pthread_once
без какой-либо помощи от планировщика. Причина, по которой я не мог использовать семафор или блокировку за once_control
, и просто выполнить инициализацию под замком, заключается в том, что функции не разрешалось сбой, а once_control
имел только тривиальную инициализацию. В этом случае pthread_once
сам не имеет определенных кодов ошибок, поэтому реализация его, возможно, сбой не оставляет вашего звонящего с любыми хорошими вариантами ...
Конечно, с этим рисунком вы должны быть осторожны при масштабировании. Каждый раз, когда всякая инициализация завершается, каждый ожидающий поток просыпается, чтобы захватить блокировку. Поэтому, когда вы разрабатываете систему, вы очень тщательно думаете о том, чтобы оштрафовать, а затем решите, что вам не стоит беспокоиться о том, чтобы что-то делать, пока вы не увидите доказанные проблемы с производительностью.
Должно ли это быть wiki сообщества? – jasonline
Поскольку вы не ищете конкретного ответа и, скорее всего, более общие «ответы». Но я больше нахожусь на заборе этого, вам, возможно, захочется дождаться ния или yay от других. – GManNickG
+1 Возьмите эти хорошо заработанные очки репутации, пока вы можете это ответить :-) –