Структура IThreadProxy
Абстракция для потока выполнения. В зависимости от ключа политики SchedulerType
созданного планировщика, диспетчер ресурсов предоставит прокси-поток, поддерживаемый обычным потоком Win32 или потоком планировщика пользовательского режима (UMS). Потоки UMS поддерживаются в 64-разрядных операционных системах Windows 7 и более поздних версий.
Синтаксис
struct IThreadProxy;
Участники
Открытые методы
Имя | Описание |
---|---|
IThreadProxy::GetId | Возвращает уникальный идентификатор прокси-сервера потока. |
IThreadProxy::SwitchOut | Отсоединяет контекст от базового корневого виртуального процессора. |
IThreadProxy::SwitchTo | Выполняет совместное переключение контекста из текущего выполняемого контекста в другой. |
IThreadProxy::YieldToSystem | Позволяет вызвавшему потоку передать выполнение другому потоку, готовому к использованию на текущем процессоре. Операционная система выбирает следующий поток для выполнения. |
Замечания
Прокси-серверы потоков связаны с контекстами выполнения, представленными интерфейсом IExecutionContext
в качестве средства отправки.
Иерархия наследования
IThreadProxy
Требования
Заголовок: concrtrm.h
Пространство имен: concurrency
Метод IThreadProxy::GetId
Возвращает уникальный идентификатор прокси-сервера потока.
virtual unsigned int GetId() const = 0;
Возвращаемое значение
Уникальный целочисленный идентификатор.
Метод IThreadProxy::SwitchOut
Отсоединяет контекст от базового корневого виртуального процессора.
virtual void SwitchOut(SwitchingProxyState switchState = Blocking) = 0;
Параметры
switchState
Указывает состояние прокси-сервера потока, выполняющего коммутатор. Параметр имеет тип SwitchingProxyState
.
Замечания
Используйте SwitchOut
при необходимости отсоединения контекста от корневого виртуального процессора, на котором он выполняется, по любой причине. В зависимости от значения, переданного параметру switchState
, и от того, выполняется ли он на корневом виртуальном процессоре, вызов немедленно вернет управление или заблокирует прокси-поток, связанный с контекстом. Вызов SwitchOut
с параметром со значением Idle
является ошибочным. Это приведет к invalid_argument исключению.
Метод SwitchOut
полезен, когда требуется сократить число корневых виртуальных процессоров у вашего планировщика либо потому, что диспетчер ресурсов рекомендовал так сделать, либо потому, что вы запросили корневой виртуальный процессор, который временно переподписан, и завершили работу с ним. В этом случае необходимо вызвать метод IVirtualProcessorRoot::Remove on the virtual processor root, прежде чем вызывать SwitchOut
параметр с заданным параметром switchState
Blocking
. Это заблокирует прокси-поток и возобновит выполнение, когда другой корневой виртуальный процессор в планировщике будет доступен для его выполнения. Прокси-сервер блокирующего потока можно возобновить, вызвав функцию SwitchTo
для переключения в контекст выполнения прокси-сервера потока. Вы также можете возобновить прокси-сервер потока с помощью связанного контекста для активации корневого каталога виртуального процессора. Дополнительные сведения о том, как это сделать, см. в разделе IVirtualProcessorRoot::Activate.
SwitchOut
также может использоваться, когда требуется повторная инициализация виртуального процессора, чтобы его можно было активировать в будущем либо при блокировке прокси-потока, либо при временном отсоединении его от корневого виртуального процессора, на котором он выполняется, и от планировщика, который обслуживается потоком. Используйте SwitchOut
с параметром switchState
со значением Blocking
, если необходимо заблокировать прокси-поток. Позже его можно будет возобновить с помощью или SwitchTo
, или IVirtualProcessorRoot::Activate
, как указано выше. Используйте SwitchOut
со значением Nesting
для этого параметра, если необходимо временно отсоединить этот прокси-поток от корневого виртуального процессора, на котором он выполняется, и от планировщика, с которым связан виртуальный процессор. Вызов SwitchOut
с параметром switchState
со значением Nesting
при выполнении на корневом виртуальном процессоре вызовет повторную инициализацию корня и продолжение работы текущего прокси-потока, когда это не будет требоваться. Прокси-сервер потока считается оставленным планировщиком до тех пор, пока он не вызовет метод IThreadProxy::SwitchOut с Blocking
последующим моментом времени. Второй вызов SwitchOut
со значением параметра Blocking
предназначен для возврата контекста в заблокированное состояние, чтобы он мог быть возобновлен с помощью или SwitchTo
, или IVirtualProcessorRoot::Activate
в планировщике, от которого его отсоединили. Поскольку он не выполнялся на корневом виртуальном процессоре, повторная инициализация не происходит.
Повторно инициализированный корневой виртуальный процессор ничем не отличается от абсолютно нового виртуального процессора, выделенного диспетчером ресурсов планировщику. Его можно использовать для выполнения, активировав его с контекстом выполнения с помощью IVirtualProcessorRoot::Activate
.
SwitchOut
необходимо вызвать интерфейс IThreadProxy
, представляющий текущий выполняемый поток или результаты не определены.
В библиотеках и заголовках, поставляемых вместе с Visual Studio 2010, этот метод не принимает параметров и не инициализирует повторно корневой виртуальный процессор. Для сохранения старого поведения значение параметра по умолчанию задано как Blocking
.
Метод IThreadProxy::SwitchTo
Выполняет совместное переключение контекста из текущего выполняемого контекста в другой.
virtual void SwitchTo(
_Inout_ IExecutionContext* pContext,
SwitchingProxyState switchState) = 0;
Параметры
pContext
Контекст выполнения для совместного переключения.
switchState
Указывает состояние прокси-сервера потока, выполняющего коммутатор. Параметр имеет тип SwitchingProxyState
.
Замечания
Используйте этот метод для переключения из одного контекста выполнения в другой из метода IExecutionContext::D ispatch первого контекста выполнения. Метод связывает контекст pContext
выполнения с прокси-сервером потока, если он еще не связан с ним. Владение текущим прокси-сервером потока определяется значением, указанным для аргумента switchState
.
Используйте значение Idle
, когда вы хотите вернуть прокси-сервер потока, выполняющийся в данный момент, в Resource Manager. Вызов SwitchTo
набора параметров switchState
Idle
приведет к запуску контекста pContext
выполнения в базовом ресурсе выполнения. Владение этим прокси-сервером потока передается в Resource Manager, и вы, как ожидается, вернелись из метода контекста Dispatch
выполнения вскоре после SwitchTo
возврата, чтобы завершить передачу. Контекст выполнения, который был отправлен прокси-сервер потока, отсоединен от прокси-сервера потока, и планировщик может повторно использовать его или уничтожить, как он видит.
Используйте значение Blocking
, если требуется, чтобы прокси-сервер потока ввел заблокированное состояние. Вызов SwitchTo
с набором Blocking
параметров switchState
приведет к запуску контекста pContext
выполнения и блокировке текущего прокси-сервера потока до его возобновления. Планировщик сохраняет владение прокси-сервером потока, когда прокси-сервер потока находится в Blocking
состоянии. Прокси-сервер блокирующего потока можно возобновить, вызвав функцию SwitchTo
для переключения в контекст выполнения прокси-сервера потока. Вы также можете возобновить прокси-сервер потока с помощью связанного контекста для активации корневого каталога виртуального процессора. Дополнительные сведения о том, как это сделать, см. в разделе IVirtualProcessorRoot::Activate.
Используйте значение Nesting
, когда вы хотите временно отключить этот прокси-сервер потока от корневого каталога виртуального процессора, на котором он запущен, и планировщик, для которого выполняется отправка работы. Вызов SwitchTo
с набором Nesting
параметров switchState
приведет к запуску выполнения контекста pContext
выполнения, а текущий прокси-сервер потока также продолжает выполняться без необходимости в корневом каталоге виртуального процессора. Прокси-сервер потока считается оставленным планировщиком до тех пор, пока он не вызывает метод IThreadProxy::SwitchOut в последующий момент времени. Метод IThreadProxy::SwitchOut
может заблокировать прокси-сервер потока, пока корневой каталог виртуального процессора не будет доступен для перепланировки.
SwitchTo
необходимо вызвать интерфейс IThreadProxy
, представляющий текущий выполняемый поток или результаты не определены. Функция вызывает, invalid_argument
если для параметра pContext
задано NULL
значение .
Метод IThreadProxy::YieldToSystem
Позволяет вызвавшему потоку передать выполнение другому потоку, готовому к использованию на текущем процессоре. Операционная система выбирает следующий поток для выполнения.
virtual void YieldToSystem() = 0;
Замечания
При вызове прокси-сервера потока, поддерживаемого обычным потоком Windows, YieldToSystem
выполняется точно так же, как функция SwitchToThread
Windows. Однако при вызове из потоков SwitchToThread
UMS в пользовательском режиме функция делегирует задачу выбора следующего потока для запуска в планировщик пользовательского режима, а не операционной системы. Чтобы добиться желаемого эффекта переключения на другой готовый поток в системе, используйте YieldToSystem
.
YieldToSystem
необходимо вызвать интерфейс IThreadProxy
, представляющий текущий выполняемый поток или результаты не определены.
См. также
Пространство имен concurrency
Структура IExecutionContext
Структура IScheduler
Структура IVirtualProcessorRoot