|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
30.10.2008, 09:46 | #1 |
Пользователь
Регистрация: 23.06.2008
Сообщений: 77
|
Функции ожидания
имею в виду функции типа
DWORD WaitForSingleObject( HANDLE hObject, DWORD dwMilliseconds); Возник вопрос - если несколько потоков ждут перехода одного и того же события в сигнальное состояние, то какой из них первым пробудится и завладеет объектом? нашла немного размышлений по этому поводу: "Официально Microsoft отвечает на этот вопрос так: «Алгоритм действует честно" Что это за алгоритм, Micro soft не говорит, потому что нс хочст связывать себя обязательствами всегда придер живаться именно этого алгоритма. Она утверждает лишь одно- если объект ожидает ся несколькими потоками, то всякий раз, когда этот объект переходит в свободное состояние, каждый из них получает шанс на пробуждение. Таким образом, приоритет потока не имеет значения- поток с самым высоким приоритетом не обязательно первым захватит объект. Не получает преимущества и поток, который ждал дольше всех. Есть даже вероятность, что какой-то поток сумеет повторно захватить объект. Конечно, это было бы нечестно по отношению к другим потокам, и алгоритм пытается не допустить этого. Но никаких гарантий нет. На самом деле этот алгоритм просто использует популярную схему "первым во шел — первым вышел" (FIFO). B принципе, объект захватывается потоком, ждавшим дольше всех. Но в системе могут произойти какие-то события, которые повлияют на окончательное решение, и ил-за этого алгоритм становится менее предсказуемым. Вот почему Microsoft и не хочет говорить, как именно он работает. " Может быть кто-то с этим сталкивался и поделится опытом, действительно ли здесь работает FIFO и с какой вероятностью. |
30.10.2008, 11:48 | #2 |
добрый няша
Старожил
Регистрация: 29.10.2006
Сообщений: 4,804
|
вопрос из разряда флудерских....
Моё ИМХО. Может где-то это особо критично, но в большинстве случаев по барабану. Какой поток будет первее в очереди тот первее и получит этот объект (FIFO). На современных компьютерах, и из-за особенностей архитектуры Windows, не важно кто первым получит процессорное время для работы с объектом. |
30.10.2008, 12:04 | #3 |
Пользователь
Регистрация: 23.06.2008
Сообщений: 77
|
|
30.10.2008, 19:46 | #4 |
Форумчанин
Регистрация: 05.12.2007
Сообщений: 236
|
Создай два разных события
|
31.10.2008, 07:41 | #5 |
Пользователь
Регистрация: 23.06.2008
Сообщений: 77
|
Д'якон,
можно поподробнее? |
02.11.2008, 09:52 | #6 |
Форумчанин
Регистрация: 05.12.2007
Сообщений: 236
|
А что непонятного? CreateEvent для каждого потока. А потом SetEvent для запуска каждого потока в свое время
|
03.11.2008, 09:00 | #7 |
Пользователь
Регистрация: 23.06.2008
Сообщений: 77
|
Дело в том, что так все равно придется с помощью дополнительных средств запоминать очередность потоков, тем более, создавать на каждый поток событие, при том что количество этих потоков не ограничено.
По поводу поставленного вопроса - сама я убедилась, что FIFO работает не всегда, иногда даже меньше всего ждущий поток получает объект. Но в основном очередь все-таки соблюдается. |
Опции темы | Поиск в этой теме |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Функции | xxxPascalxxx | Помощь студентам | 2 | 28.12.2007 18:04 |
Функции | Vinni_puh | Microsoft Office Excel | 1 | 20.12.2007 05:51 |
Функции | furian | Общие вопросы C/C++ | 3 | 18.12.2007 12:48 |
Функции | Pedro | Общие вопросы Delphi | 5 | 08.11.2007 15:39 |
блокирование функции | Fireleo | Win Api | 5 | 29.07.2007 17:04 |