Поделиться через


Структура 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 выполняется точно так же, как функция SwitchToThreadWindows. Однако при вызове из потоков SwitchToThread UMS в пользовательском режиме функция делегирует задачу выбора следующего потока для запуска в планировщик пользовательского режима, а не операционной системы. Чтобы добиться желаемого эффекта переключения на другой готовый поток в системе, используйте YieldToSystem.

YieldToSystem необходимо вызвать интерфейс IThreadProxy , представляющий текущий выполняемый поток или результаты не определены.

См. также

Пространство имен concurrency
Структура IExecutionContext
Структура IScheduler
Структура IVirtualProcessorRoot