Здесь (developers.sun.com) - небольшая статья от Sun о том, как они реализовали свою эмуляцию WaitForMultipleObjects
в Solaris.Основная идея состоит в том, чтобы связать список переменных условия с дескриптором (защищенным мьютексом) и сигнализировать все переменные условия всякий раз, когда дескриптор сигнализируется.Каждый раз, когда вы вызываете эмулированный WaitForMultipleObjects
, создается новая переменная условия и добавляется в список всех интересующих вас дескрипторов. В эмуляции WaitForMultipleObjects
вы блокируете переменную условия и проверяете каждый из своих дескрипторов, когдавы просыпаетесь.
Причина, по которой существует список переменных условий (а не один), заключается в том, что у вас может быть два потока, блокирующих дескрипторы: поток 1 заблокирован на A и B и поток 2заблокирован на A и C. Сигнализация B не должна пробуждать поток 2. Так как каждый вызов WaitForMultipleObjects
создает новую переменную условия, в этом сценарии B и C будут иметь одну отдельную переменную условия каждая, и A будет иметь оба условияПеременные.
Для получения более подробной информации, вам нужно прочитать саму статью.