Форум программистов, компьютерный форум CyberForum.ru

Delphi и WinAPI

Войти
Регистрация
Восстановить пароль
 
Jin X
Евгений, Самара
350 / 303 / 61
Регистрация: 14.12.2014
Сообщений: 805
#1

SetEvent + WaitForSingleObject - Delphi WinAPI

22.09.2016, 19:54. Просмотров 551. Ответов 7
Метки нет (Все метки)

Есть ли гарантия, что WaitForSingleObject успеет сработать, если другой поток сделает SetEvent и CloseHandle подряд?

Добавлено через 37 минут
И ещё вопрос: каких значений не бывает у хэндла (кроме 0)?
Ну, например, 1 или -1.
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Убежденный
Системный программист
Эксперт С++
15173 / 6805 / 1073
Регистрация: 02.05.2013
Сообщений: 11,118
Завершенные тесты: 1
22.09.2016, 20:21     SetEvent + WaitForSingleObject #2
Цитата Сообщение от 7in Посмотреть сообщение
Есть ли гарантия, что WaitForSingleObject успеет сработать, если другой поток сделает SetEvent и CloseHandle подряд?
Нет такой гарантии. Поведение WaitForXxx в этом случае не определено.

Цитата Сообщение от 7in Посмотреть сообщение
И ещё вопрос: каких значений не бывает у хэндла (кроме 0)?
Точно знаю, что не бывает NULL, INVALID_HANDLE_VALUE и (ULONG_PTR)-2.
Jin X
Евгений, Самара
350 / 303 / 61
Регистрация: 14.12.2014
Сообщений: 805
22.09.2016, 21:46  [ТС]     SetEvent + WaitForSingleObject #3
А INVALID_HANDLE_VALUE не бывает для любых хэндлов или только для файловых?
Убежденный
Системный программист
Эксперт С++
15173 / 6805 / 1073
Регистрация: 02.05.2013
Сообщений: 11,118
Завершенные тесты: 1
22.09.2016, 22:03     SetEvent + WaitForSingleObject #4
Для 99% типов хэндлов INVALID_HANDLE_VALUE является недопустимым значением.


Единственное, пожалуй, исключение из этого правила - Non-IFS Handle в Layered Service Provider,
но я не уверен, что там функции будут работать с таким значением.
jupman
183 / 86 / 13
Регистрация: 10.11.2015
Сообщений: 232
23.09.2016, 04:46     SetEvent + WaitForSingleObject #5
Цитата Сообщение от Убежденный Посмотреть сообщение
Точно знаю, что не бывает NULL, INVALID_HANDLE_VALUE и (ULONG_PTR)-2.
Есть ещё псевдохэндлы, получаемые посредством вызова GetCurrentProcess/GetCurrentThread. Значение псевдохэндла процесса -1 (INVALID_HANDLE_VALUE), а потока -2.
Jin X
Евгений, Самара
350 / 303 / 61
Регистрация: 14.12.2014
Сообщений: 805
23.09.2016, 14:01  [ТС]     SetEvent + WaitForSingleObject #6
Ага. Ещё раз: т.е. для мьютексов, семафоров и ивентов -1 и -2 точно быть не может, правильно?
Jin X
Евгений, Самара
350 / 303 / 61
Регистрация: 14.12.2014
Сообщений: 805
24.09.2016, 21:50  [ТС]     SetEvent + WaitForSingleObject #7
Убежденный, jupman ???
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.09.2016, 22:34     SetEvent + WaitForSingleObject
Еще ссылки по теме:

Мютекс и WaitForSingleObject C#
Delphi Не работает WaitForSingleObject
Qt аналог функции WaitForSingleObject из WinAPI C++ Qt
C++ Приложение останавливается на WaitForSingleObject
C++ Builder Разница между TThread::WaitFor и WaitForSingleObject

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Убежденный
Системный программист
Эксперт С++
15173 / 6805 / 1073
Регистрация: 02.05.2013
Сообщений: 11,118
Завершенные тесты: 1
24.09.2016, 22:34     SetEvent + WaitForSingleObject #8
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Дело в том, что числовые значения хэндлов являются недокументированным
поведением системы и закладываться на это поведение опасно.
NULL, (PVOID)-1 и (PVOID)-2 точно не могут использоваться ни для каких
хэндлов (ну за исключением, быть может, Non-IFS socket handle, но я не уверен).

Вообще, если понаблюдать за тем, какие числовые значения присваиваются хэндлам,
то можно найти некоторые простые закономерности: значения кратны четырем,
идут по возрастающей (например, 0xC4, 0xC8, 0xCC, 0xD0 и т.д).
Младший бит у хэндлов точно не используется. Например, в I/O Completion Port
младший бит event-а может использоваться для хранения специальной информации.
Еще можно глянуть в исходниках Win2K/WRK функцию ExCreateHandle.
После этого приходит ясность по поводу того, что INVALID_HANDLE_VALUE ну
никак не может оказаться валидным значением для хэндла, даже случайно
То же самое с NULL и (PVOID)-2.
Yandex
Объявления
24.09.2016, 22:34     SetEvent + WaitForSingleObject
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru