многопоточность — вход в критическую секцию и переключение контекста в переполнении стека

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

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

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

4

Решение

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

От MSDN (выделение мое):

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

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

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

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

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

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

4

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector