· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› Про Mutex

Посл.отвђт Сообщенiе


Дата: Май 5, 2004 01:19:14 · Поправил: PavPS

Всем привет!
После прочтения статьи Four-F окончательно решился задать вопрос об этом звере :)
Вопрос касательно тонкости, связанной с снисходительным обращением с собственной нитью. IF какая-то нить создает(инициализирует) Mutex, то OwnerThread заполняется, соответственно, идентификатором этого потока. В вышеупомянутой статье всё гладко – на это не падает, т.к. driveentry, которая вып-ся потоком, запускающем драйвер (если не ошибаюсь) заполняет структуру Mutex??? , а ждут этот Mutex другие созданные нити. А если синхронизация нужна уже на момент вып-я DriveEntry , то создавая объект Mutex в DriveEntry, получаем такой эффект: все(нити, так же созданные) ждут объекта, а поток DriveEntry проходит мимо Wait «нахаляву» => получаем «плохой» исход.
Таперча долгожданный риторический вопрос: «Что делать???». Не создавать же в отдельном потоке-комикадзе и убивать его потом. Я нашел другую дорогу – у Event-а таких заморочек нет. Но все же хотелось бы Mutex!

Заранее благодарен. --==ППС==--


Дата: Май 5, 2004 15:04:22

[ PavPS: IF какая-то нить создает(инициализирует) Mutex, то OwnerThread заполняется, соответственно, идентификатором этого потока. ]

OwnerThread заполняется не идентификатором, а указателем на обоъект "поток".
При инициализации (KeInitializeMutex) это поле не заполняется.

OwnerThread заполняет KeWaitForMutexObject, когда поток захватывает мьютекс, т.е. этот поток становится владельцем мьютекса.


[ PavPS: т.к. driveentry, которая вып-ся потоком, запускающем драйвер (если не ошибаюсь) ]

Ошибаешься. DriveEntry выполняется системным потоком. См. "Часть 5: Полнофункциональный драйвер" - там табличка в конце есть.



ЗЫ: Вопрос прочитал три раза, но ничего не понял :( Единственный грамотно сформулированный вопрос - это «Что делать???» ;)))


Дата: Май 5, 2004 23:05:16

Про driveentry-это так, - празники были, позабыл :)))
Пока писал ответ с подробными разъяснениями, блин, сам и разобрался. :)
Заморачивалсято я на том, что последовательно вызавал сначала 1 раз инициализацию и 2 раза ожмдание мутанта подряд, и получал, что на второй раз он пролетал мимо wait. Знал, что для своего потока все подругому, но не знал, что этот злощастный OwnerThread заполняется при Wait-фии, а не при KeInit... вот типа и всё.
Извиняйте.


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.076