![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| Kuvaldis |
|
|||
![]() механик-вредитель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1189 Регистрация: 16.6.2006 Где: Минск Репутация: нет Всего: 61 |
Всем привет!
В 4-м издании Рихтера есть реализация оптимизированного мьютекса. В реализации функций Enter есть вопрос:
Не очень ясно, зачем в Enter стоит блок (1), ведь в TryEnter() есть блок (2) -------------------- Помни - когда ты спишь, враг не дремлет Спи чаще и дольше, изматывай врага бессоницей |
|||
|
||||
| SergeCpp |
|
|||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 955 Регистрация: 8.8.2005 Где: At Home Репутация: 10 Всего: 124 |
Подсказка в девятой строке
![]() Не очень ясна высказанная тут связь ("зачем" -> "ведь") между блоками 1 и 2 (это ещё подсказка) Третья подсказка: детально опишите это "зачем" -> "ведь" |
|||
|
||||
| Kuvaldis |
|
|||
![]() механик-вредитель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1189 Регистрация: 16.6.2006 Где: Минск Репутация: нет Всего: 61 |
SergeCpp,
Если мы не получили мьютекс в TryEnter() то понятно, что блок 62-68 не отработал Соотвественно, в 21-24 идет повторная проверка совпадения m_psi->m_dwThreadId == dwThreadId МНе кажется, что данную проверку нужно использовать, если у нас нету спин-блокировки, т.е. когда в Enter() не вызывается TryEnter() И еще, мы ж в строке 9 не ждем?.. Ожидаем только событие в 29? Что-то я запутался :( Это сообщение отредактировал(а) Kuvaldis - 9.3.2008, 16:14 -------------------- Помни - когда ты спишь, враг не дремлет Спи чаще и дольше, изматывай врага бессоницей |
|||
|
||||
| korian |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 651 Регистрация: 8.3.2008 Где: Украина, Харьков Репутация: 4 Всего: 17 |
Kuvaldis
кароче мало понимаю, что тут вообще происходит но скажу что блок 1 блок 2 совсем не повторяються, если детальней рассматривать. первых блок, если полностью расписать получаеться:
второй блок расписываем... получаеться:
я правда не знаю чем отличаются InterlockedIncrement от InterlockedCompareExchange... но видно чем-то существенным. Добавлено через 5 минут и 48 секунд к чему я это... если выполняеться 2-й блок, то 1-й блок не выполняеться 100%, т.к. там if (TryEnter()) { return; // We got it, return } ну и предпологаю, что в обратную сторону тоже самое, если не выполняеться 2-й блок, выполняеться 1-й |
||||
|
|||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |