×
Namespaces

Variants
Actions

Активные объекты и нити

From Nokia Developer Wiki
Jump to: navigation, search
Article Metadata

Статья
Автор: Den123 (26 Jul 2007)
Последнее редактирование: hamishwillee (10 Nov 2011)

Перевод с английского, оригинальная статья находится здесь.


В Symbian OS интенсивно используется асинхронное взаимодействие. Виртуально, все системные службы представлены как программные серверы, каждый из которых является отдельным процессом для большей надежности.

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

На практике, использование множества нитей характерно для систем с вытесняющей многозадачностью. В таких системах каждая асинхронная задача выполняется на отдельной нити, а ожидание окончания выполнения запроса часто контролируется с помощью опроса (polling) сервис-провайдера. Реализовать такой подход можно и в Symbian OS, однако, строго не рекомендуется, в связи с неэффективностью.

Другой вариант реализации асинхронного взаимодействия - использование активных объектов. См. Активные объекты (Active Objects) в Symbian ОС.


Contents

Различие между нитями и активными объектами

С помощью активных объектов реализуется кооперативная многозадачность на одной нити. Получив управление, активный объект не может быть вытеснен планировщиком, в рамках которого он выполняется, другой активный объект получит управление только после того, как предыдущий завершит свою работу. С помощью нитей реализуется вытесняющая многозадачность, контролируемая ядром.

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


Когда использовать нити необходимо

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


Преимущества активных объектов по сравнению с нитями

  • Активные объекты работают на одной нити - не нужно тратить ресурсы на переключение контекстов, которое неизбежно при работе многонитевого приложения.
  • Нет необходимости в синхронизации данных.
  • Использование активных объектов для обработки событий в Symbian OS более предпочтительно т.к. они работают более эффективно.
  • Нити увеличивают расход памяти, так как каждая нить использует собственный стек.
  • Переключение между нитями работает медленнее, чем между активными объектами в цикле планировщика.


Пример использования нити

// Имя нити
_LIT(KThreadName, "MyFirstThread");
 
// Создание нити, принадлежащей текущему процессу,
// получение дескриптора
TInt res = iThread.Create( KThreadName, ThreadEntryPoint, KDefaultStackSize,
NULL, &iVariable);
 
// Подготавливаем нить к началу выполнения.
// Сразу после создания нить находится в состоянии ожидания (suspended)
// для того чтобы нить начала работать, необходимо вызвать метод Resume().
iThread.Resume();
 
// Как только нить начнет выполняться, контроль будет передан этой функции.
// В данном примере, функция просто меняет значение переданной переменной.
TInt CThreadExampleAppUi::ThreadEntryPoint(TAny* param)
{
TInt* para = static_cast<TInt *>(param);
*para = 1;
return 1;
}

Symbian OS оптимизирована для однонитевых приложений, для организации асинхронного взаимодействия использование активных объектов является предпочтительным. Старайтесь проектировать Ваши приложения для реализации с использованием только одной нити.

This page was last modified on 10 November 2011, at 06:15.
41 page views in the last 30 days.

Was this page helpful?

Your feedback about this content is important. Let us know what you think.

 

Thank you!

We appreciate your feedback.

×