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