Должен ли я использовать Mutex ИЛИ Критический раздел для Windows Mobile RIL

StackOverflow https://stackoverflow.com/questions/2482208

Вопрос

Я использую Интерфейс радиоуровня (RIL) Собственные API в Приложение для Windows Мобильное.В этом API возвращаемые значения/результаты большинства функций не возвращаются немедленно, а передаются через функцию обратного вызова, которая передается в RIL API.

Некоторые примеры использования можно найти по адресу Инструменты разработки XDA и Google Шестерни Геолокация API.

Мой вопрос: в этих двух примерах для защиты данных вместо других объектов синхронизации используется мьютекс.

Теперь, подойдет ли Критическая секция в случаях использования, описанных в обоих примерах?Какой поток или процесс на самом деле вызовет функции обратного вызова?

Редактировать:
Доступ к моим данным осуществляется моими кодами только изнутри моего процесса, но какой поток/процесс вызывает функции обратного вызова в RIL API?Я имею в виду, что я передал обратный вызов функции в RIL API, но вызываются ли обратные вызовы из другого процесса?в этом случае это даст другое объяснение, почему образцы используют Mutex.Если RIL API действительно создает поток внутри моего процесса и вызывает мои функции обратного вызова, то я думаю, что критическая секция подойдет (и это быстрее, чем мьютекс).

Обновлять:
У меня есть данные, которые (1) доступны мои коды из моего собственного процесса, а также (2) изменен из обратного вызова функции.Обратный вызов выполняется RIL API.

Мой вопрос:Какой поток/процесс вызывает функции обратного вызова в RIL API?

История до сих пор:
Мне: Привет, мистер РИЛ, пожалуйста, внесите в мой офис некоторые данные (т. е. переменные).
РИЛ: ОК сэр.Я размещу данные позже и сообщу вам, когда это будет сделано (здесь я использовал событие).

Для входа в мой кабинет требуется карта доступа.Если г-н РИЛ из той же компании, что и я, г-н РИЛ может использовать свою карту доступа для входа в мой офис (в моем случае это означает критический отдел).Если он из других компаний, мне нужно будет настроить для него карту доступа/карту посетителя (в моем случае здесь нужен мьютекс).

Если г-н РИЛ использует свою собственную карту доступа, это означает, что мне не нужно создавать для него карту доступа/карту посетителя, и это означает меньше проблем для меня.(т.е.Критическая секция работает быстрее, чем мьютекс)

Проблема в том, что я встретил этого мистера РИЛа всего несколько дней назад и мало что о нем знаю.Я не знаю, из той же ли он компании, что и я.Один из вариантов, как упомянул к нобугз заключается в том, чтобы создать карту доступа для г-на РИЛ независимо от того, является ли г-н РИЛ из той же компании, что и я.Таким образом, мистер РИЛ гарантированно сможет войти в мой кабинет.(мои данные/переменные гарантированно будут в безопасности)

Сейчас я использую мьютекс в своем коде (установил, возможно, резервную карту доступа для Mr RIL).

Ага!Просто возникла идея, когда писал это.Думаю, я просто спрошу господина РИЛ, из какой он компании.Таким образом, мне не придется в будущем оформлять для него карту доступа, если он окажется в одной компании со мной.(т.е.помещать GetCurrentProcessId() и GetCurrentThreadId() в функции обратного вызова)

Это было полезно?

Решение

RIL для Windows Mobile обычно находится в файле device.exe (для WM6.x).Однако когда ваш процесс вызывает RIL, ваш вызов проходит через прокси-сервер RIL.

Прокси-сервер RIL связан с вашим процессом, находится в нем и решает за вас все проблемы, связанные с границами процесса (кстати, это, по крайней мере, одна из причин, по которой все структуры данных RIL должны быть упакованы в один файл). блок памяти известного размера).Внутренне прокси-сервер RIL создает поток, в котором выполняется обратный вызов.

Это означает, что ваш код может использовать объект CRITICAL_SECTION для обеспечения необходимой синхронизации/защиты.

Другие советы

Смысл использования мьютекса заключается в том, что вы не знаете, какой поток может выполнить обратный вызов.Да, критический раздел тоже подойдет.Будьте осторожны: если сделать что-то неправильно, это приведет к случайным и очень трудно диагностировать неисправность.

Критический раздел является мьютекс.Критическая секция отличается от обычного мьютекса (по крайней мере, в первую очередь) в одном:это специфично для одного процесса, где мьютекс может использоваться между процессами.

Итак, в этом случае основной вопрос заключается в том, что именно вы защищаете: если данные внутри вашей программы не будут доступны другому процессу, тогда критический раздел должен хорошо выполнять эту работу.Если вы защищаете что-то, что будет совместно использоваться двумя процессами, если пользователь запустит два экземпляра вашей программы одновременно, то вам, вероятно, понадобится мьютекс.

Редактировать:Что касается необходимости использовать критическую секцию для защиты того, что делает сам RIL, то нет, это не так (или, по крайней мере, определенно не должен) быть нужным.Используя мьютекс, вы рассчитываете на то, что все процессы будут сотрудничать, открывая мьютекс с тем же именем для управления доступом к общим ресурсам.На это рассчитывать нельзя, поэтому, если это понадобится, интерфейс полностью сломан.

Обновлять:если они не делают что-то действительно необычное в RIL, обратный вызов произойдет внутри вашего процесса, поэтому критического значения должно быть достаточно.Если он изменяет ваши данные, это означает, что ваши данные отображаются и видны этому коду, а это означает, что данные в данных в критическом разделе также будут сопоставлены и видимы, и это будет работать.Критический раздел не работает, когда вы имеете дело с отдельными процессами, поэтому данные в одном не отображаются/не видны в другом.

Ну, еще одно различие между мьютексом и критическим разделом (конечно, реализациями Windows) заключается в том, что критический раздел является повторно входящим, т.е.один и тот же поток может получить критическую секцию дважды, не освобождая ее.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top