Вход в критическую секцию и переключение контекста в C++

Я новичок в программировании потоков (в настоящее время необходимо использовать win32 и C++ в проекте компании), и я просто хочу спросить, означает ли ввод критического раздела отсутствие переключения контекста? Означает ли это, что поток заблокирует ресурсы, пока не покинет критическую секцию?

Кроме того, в настоящее время я читаю книгу "Многопоточность приложений в Win32", и она кажется хорошей, но есть ли книга для новичков, которая лучше изучает многопоточность в win32?

Большое спасибо заранее ^_^

1 ответ

Вы просто пользовательский процесс, вы не можете предотвратить переключение контекста ОС на другой процесс. Это означает, что никакой другой поток в вашем процессе не может войти в критический раздел, пока первый поток не покинет его.

Из MSDN (акцент мой):

Поток использует EnterCriticalSection или же TryEnterCriticalSection функция запроса владения критическим разделом. Он использует LeaveCriticalSection функция освобождения владения критическим разделом. Если объект критической секции в настоящее время принадлежит другому потоку, EnterCriticalSection бесконечно ждет владения.

И опять, EnterCriticalSection говорит:

Ожидает владения указанным объектом критического раздела. Функция возвращается, когда вызывающему потоку предоставлено право собственности.

Чтобы ответить на вопрос "помешает ли это переключению контекста между потоками". Нет, не совсем. Скажем, у вас есть две темы, A и B. Звонки EnterCriticalSection и входит в CS. Пока он использует общий ресурс в CS, ОС все еще может переключать контекст в поток B. Б будет продолжать бежать, как он делал раньше, пока он не доберется до EnterCriticalSection вызов, в этот момент он заблокирует.

Теперь, как эта блокировка реализована на самом деле до Windows. Но, скорее всего, вместо "вращения" (Могу ли я войти? Нет. Сейчас? Нет. Сейчас? Нет.) ОС будет помещать этот поток в "заблокированную" очередь, а не планировать поток, пока он не ожидает (CS) доступен. На этот момент он будет намечен, и вызов EnterCriticalSection преуспеет.

Смотрите также

Другие вопросы по тегам