![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| GremlinProg |
|
||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
есть поток x, обрабатывающий некоторое число событий:
LockEvents:
структура Events такова: Events[ evidLock ] - семафор Events[ evidAbort ] - событие останова Events[ evidWake ] - холостой ход Events[ ... ] - динамические события далее, есть статический набор воркеров(потоков), которые реагируют на динамические события, воркеры могут менять содержимое Events, следовательно так же блокируют работу с этим вектором с помощью Lock/UnlockEvents, но, чтобы не было дедлока, перед этим необходимо активировать событие evidWake, которое пробуждает поток x и выводит его из эксклюзивного участка кода для таких случаев предусмотрен метод SignalObjectAndWait, который должен атомарно активировать одно и перейти в режим ожидания второго объекта ожидания, т.е. работа воркера, с учетом LockEvents должна быть такой:
все работает хорошо, если не считать редких случаев, когда наступает дедлок, путем анализа сообщений диагностики, обнаружил его именно на вызове SignalObjectAndWait, т.е. вызов SignalObjectAndWait активирует evidWakeup но перед ожиданием evidLock, видимо, все же успевает переключить контекст на поток x, который спокойно отрабатывает холостую итерацию и проходит критическую точку LockEvents(), что и вводит воркер в ступор решил проблему на воркере, путем периодического вызова SignalObjectAndWait, по истечении 200мс, но основной месаж все же остался: SignalObjectAndWait таки уже не атомарен, и альтернативы, по всей видимости нет, или я что-то упустил? тем не менее, в 2008-м MSDN, он еще atomically:https://docs.google.com/open?id=0B3exyGGpaH...WY5NjRmYmY2NDcy p.s.: похоже, пора обновлять документацию -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
||||||
|
|||||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 40 Всего: 223 |
В текущей версии MSDN (по твоей ссылке) написано, что уже не атомарна
|
|||
|
||||
| GremlinProg |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
знаю, об чем собственно и речь
-------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
||||
|
|||||
![]()
|
| Правила форума "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. |