Вход в критическую секцию и переключение контекста в C++
Я новичок в программировании потоков (в настоящее время необходимо использовать win32 и C++ в проекте компании), и я просто хочу спросить, означает ли ввод критического раздела отсутствие переключения контекста? Означает ли это, что поток заблокирует ресурсы, пока не покинет критическую секцию?
Кроме того, в настоящее время я читаю книгу "Многопоточность приложений в Win32", и она кажется хорошей, но есть ли книга для новичков, которая лучше изучает многопоточность в win32?
Большое спасибо заранее ^_^
1 ответ
Вы просто пользовательский процесс, вы не можете предотвратить переключение контекста ОС на другой процесс. Это означает, что никакой другой поток в вашем процессе не может войти в критический раздел, пока первый поток не покинет его.
Из MSDN (акцент мой):
Поток использует
EnterCriticalSection
или жеTryEnterCriticalSection
функция запроса владения критическим разделом. Он используетLeaveCriticalSection
функция освобождения владения критическим разделом. Если объект критической секции в настоящее время принадлежит другому потоку,EnterCriticalSection
бесконечно ждет владения.
И опять, EnterCriticalSection
говорит:
Ожидает владения указанным объектом критического раздела. Функция возвращается, когда вызывающему потоку предоставлено право собственности.
Чтобы ответить на вопрос "помешает ли это переключению контекста между потоками". Нет, не совсем. Скажем, у вас есть две темы, A и B. Звонки EnterCriticalSection
и входит в CS. Пока он использует общий ресурс в CS, ОС все еще может переключать контекст в поток B. Б будет продолжать бежать, как он делал раньше, пока он не доберется до EnterCriticalSection
вызов, в этот момент он заблокирует.
Теперь, как эта блокировка реализована на самом деле до Windows. Но, скорее всего, вместо "вращения" (Могу ли я войти? Нет. Сейчас? Нет. Сейчас? Нет.) ОС будет помещать этот поток в "заблокированную" очередь, а не планировать поток, пока он не ожидает (CS) доступен. На этот момент он будет намечен, и вызов EnterCriticalSection
преуспеет.
Смотрите также
- MSDN: использование объектов критического сечения
- Википедия: Критический раздел