WinRequestMutexSem()
Классический дидлок - это два мютекса, захват которых производится в разных нитках в разном порядке. Будет проблема.
Выход - всегда захватывать в одном порядке.
Но вот проблема, использование WinSendMsg как бы добавляет второй неявный мютекс,
т.е. если между захватом и освобождением мютексов юзается WinSendMsg, то тут порядок такой - захват мютекса, потом захват
неявного мютекса очереди,
а если вызов произошел из обработчика очереди - то сначала захват мютекса очереди, потом захват мютекса нужного ресурса.
классический дидлок
Конечно, если между захватами нету сендов, то не страшно. Но кто в большой программе сможет такое гарантировать?
WinRequestMutexSem пытается захватить укзанный мютекс, не захватывая очередь. Т.е. если еще одна нитка сделает send - он
пройдет. Только post будет накапливаться. Работает он с той же скоростью что и обычный.
Вывод - во всех PM апликухах от греха подальше заменить DosRequestMutexSem на WinRequestMutexSem.
(thx Glassman)
|