Отправляет email-рассылки с помощью сервиса Sendsay

Статьи по Visual C++

  Все выпуски  

Статьи по Visual C++.NET Критические секции


Информационный Канал Subscribe.Ru

В начало Ozon.ru
  Главная | Новости | Статьи | Каталог | Регистрация | Поиск

Новые статьи

1. Как проследить чтобы только одна копия приложения работала в данный момент (Mutex)
2. Окно OpenGL
3. Как удалить ключ из реестра?
4. Передача сокетов между процессами
5. Перехват Ctrl+Alt+Del
6. OpenGL: Основы. (Часть 2)
7. OpenGL: Основы. (Часть 1)
8. Режимы отображения координат

Свежие компьютерные новости

09.12.2005 Microsoft проводит конкурс по разработке ПО для Windows SharePoint Services
09.12.2005 Intel предлагает заменить кремниевые транзисторы
09.12.2005 Microsoft выпустила пакет Dynamics CRM 3.0
09.12.2005 Публичная бета-версия IE7 появится в начале 2006 года
08.12.2005 Хакеры уже не смогут использовать дыру в IE для доступа к Google Desktop
08.12.2005 ОС Windows Server 2003 R2 отправилась в производство
07.12.2005 В Windows Vista количество перезагрузок сведено к минимуму
07.12.2005 Дыра в IE позволяет красть информацию через Google Desktop
07.12.2005 Первый микрочип памяти GDDR4 ёмкостью 512 Мбит

Критические секции

Понятие критической секции позволяет уберечь определенные области программы так, чтобы в этой области программы в данный момент времени исполнялся бы только один поток. Рассмотрим функции для работы с критической секцией. InitializeCriticalSection – данная функция создаёт объект под название критическая секция.

VOID InitializeCriticalSection
(
    LPCRITICAL_SECTION lpCriticalSection
)

Параметры функции: первый параметр – указатель на структуру, указанную ниже. Поля данной структуры используются только внутренними процедурами, и смысл их безразличен.

EnterCriticalSection – войти в критическую секцию. После выполнения этой функции данный поток становится владельцем данной секции. Следующий поток, вызвав данную функцию, будет находиться в состоянии ожидания. Параметр функции такой же, что и в предыдущей функции.

LeaveCriticalSection – покинуть критическую секцию. После этого второй поток, который был остановлен функцией EnterCriticalSection, станет владельцем критической секции. Параметр функции LeaveCriticalSection такой же, как и у предыдущих функций.

DeleteCriticalSection – удалить объект «критическая секция». Параметр аналогичен предыдущим.

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

Я приведу пример из MSDN использования этих функций:

// Global variable
CRITICAL_SECTION CriticalSection; 

void main()
{
    ...

    // Initialize the critical section one time only.
    InitializeCriticalSection(&CriticalSection); 

    ...

    // Release resources used by the critical section object.
    DeleteCriticalSection(&CriticalSection)
}

DWORD WINAPI ThreadProc( LPVOID lpParameter )
{
    ...

    // Request ownership of the critical section.
    __try 
    {
        EnterCriticalSection(&CriticalSection); 

        // Access the shared resource.
    }
    __finally 
    {
        // Release ownership of the critical section.
        LeaveCriticalSection(&CriticalSection);
    }

    ...

}

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




Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.prog.visualc
Архив рассылки
Отписаться
Вспомнить пароль

В избранное