Программирование для Windows NT

       

Рекурсивный вход в критическую секцию


Операционная система Microsoft Windows NT допускает рекурсивный вход в критическую секцию. Например, приведенный выше фрагмент кода можно было бы составить следующим образом:

EnterCriticalSection(&csWindowPaint);

PaintClient(hWnd);

LeaveCriticalSection(&csWindowPaint);

. . . 

void PaintClient(HWND hWnd)

{

  . . .

  EnterCriticalSection(&csWindowPaint);

  hdc = BeginPaint(hWnd, &ps);

  GetClientRect(hWnd, &rc);

  DrawText(hdc, "SDI Window", -1, &rc,

    DT_SINGLELINE | DT_CENTER | DT_VCENTER);

  EndPaint(hWnd, &ps);

  LeaveCriticalSection(&csWindowPaint);

}

Здесь мы выполняем вызов функции PaintClient, находясь в критической секции csWindowPaint. При этом сама функция PaintClient также пользуется той же критической секцией.

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



Содержание раздела