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


Структура IThreadProxy

Абстракция для потока выполнения. В зависимости от SchedulerType ключа политики, созданного вами планировщика, диспетчер ресурсов предоставит прокси, поддерживаемый либо обычным потоком Win32, либо потоком, планируемым на уровне пользовательского режима (UMS). Потоки UMS поддерживаются в 64-разрядных операционных системах Windows 7 и более поздних версий.

Синтаксис

struct IThreadProxy;

Участники

Открытые методы

Имя Описание
IThreadProxy::GetId Возвращает уникальный идентификатор прокси потока.
IThreadProxy::SwitchOut Отсоединяет контекст от базового корневого виртуального процессора.
IThreadProxy::SwitchTo Выполняет совместное переключение контекста из текущего выполняемого контекста в другой.
IThreadProxy::YieldToSystem Позволяет вызвавшему потоку передать выполнение другому потоку, готовому к выполнению на текущем процессоре. Операционная система выбирает следующий поток для выполнения.

Замечания

Прокси потоков связаны с контекстами выполнения, представленными интерфейсом IExecutionContext, для распределения задач.

Иерархия наследования

IThreadProxy

Требования

Заголовок: concrtrm.h

Пространство имен: конкурентность

Метод 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 на корне виртуального процессора, прежде чем делать вызов к SwitchOut, при этом параметр switchState должен быть установлен на Blocking. Это заблокирует прокси-поток и возобновит выполнение, когда другой корневой виртуальный процессор в планировщике будет доступен для его выполнения. Прокси-сервер блокирующего потока можно возобновить, вызвав функцию SwitchTo, чтобы переключить контекст выполнения на данный прокси-сервер потока. Вы также можете возобновить прокси потока, используя его связанный контекст для активации основы виртуального процессора. Дополнительные сведения о том, как это сделать, см. в разделе IVirtualProcessorRoot::Activate.

SwitchOut также может использоваться, когда требуется повторная инициализация виртуального процессора, чтобы его можно было активировать в будущем, либо блокируя прокси-поток, либо временно отсоединяя его от корня виртуального процессора, на котором он выполняется, и от диспетчера задач, для которого он выполняет работу. Используйте SwitchOut с параметром switchState со значением Blocking, если необходимо заблокировать прокси-поток. Позже его можно будет возобновить с помощью или SwitchTo, или IVirtualProcessorRoot::Activate, как указано выше. Используйте SwitchOut со значением Nesting для этого параметра, если необходимо временно отсоединить этот прокси-поток от корневого виртуального процессора, на котором он выполняется, и от планировщика, с которым связан виртуальный процессор. Вызов SwitchOut с параметром switchState, установленным в значение Nesting, когда он выполняется на корневом виртуальном процессоре, приведет к повторной инициализации корневого виртуального процессора, а прокси текущего потока продолжит выполнение без необходимости в этом. Потоковый прокси считается покинувшим планировщик до тех пор, пока не вызовет метод IThreadProxy::SwitchOut в более поздний момент времени. Второй вызов 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::Dispatch первого контекста выполнения. Метод связывает контекст pContext выполнения с прокси-сервером потока, если он еще не связан с ним. Владение текущим прокси-сервером потока определяется значением, указанным для аргумента switchState .

Используйте значение Idle , когда вы хотите вернуть прокси-сервер потока, выполняющийся в данный момент, в Resource Manager. Вызов SwitchTo, где параметр switchState установлен в Idle, вызовет выполнение контекста pContext на базовом ресурсе выполнения. Владение этим прокси-потока передается диспетчеру ресурсов, и ожидается, что вы должны возвратиться из метода в контексте выполнения Dispatch, вскоре после завершения SwitchTo, чтобы завершить передачу. Контекст выполнения, который был передан прокси-серверу потока, отсоединен от него, и планировщик может повторно использовать его или уничтожить, как считает нужным.

Используйте значение Blocking, если требуется, чтобы потоковый прокси-сервер перешел в заблокированное состояние. Вызов SwitchTo с параметром switchState, установленным в Blocking, приведет к запуску контекста выполнения pContext и блокировке текущего прокси потока до его возобновления. Планировщик сохраняет владение прокси-сервером потока, когда прокси-сервер потока находится в Blocking состоянии. Прокси-сервер блокирующего потока можно возобновить, вызвав функцию SwitchTo, чтобы переключить контекст выполнения на данный прокси-сервер потока. Вы также можете возобновить прокси потока, используя его связанный контекст для активации основы виртуального процессора. Дополнительные сведения о том, как это сделать, см. в разделе IVirtualProcessorRoot::Activate.

Используйте значение Nesting, когда вы хотите временно отключить этот прокси-сервер потока от корня виртуального процессора, на котором он работает, и от планировщика, который выполняет отправку работы. Вызов SwitchTo с параметром switchState, установленным на Nesting, приведет к запуску контекста выполнения pContext, а текущий прокси потока также продолжит выполняться без необходимости в корне виртуального процессора. Прокси-сервер потока считается оставленным планировщиком до тех пор, пока он не вызывает метод IThreadProxy::SwitchOut в последующий момент времени. Метод IThreadProxy::SwitchOut может заблокировать прокси потока, пока корень виртуального процессора не станет доступным для перепланировки.

SwitchTo необходимо вызывать на интерфейсе IThreadProxy, который представляет собой текущий выполняемый поток, иначе результаты неопределённые. Функция вызывает, invalid_argument если для параметра pContext задано NULLзначение .

Метод IThreadProxy::YieldToSystem

Позволяет вызвавшему потоку передать выполнение другому потоку, готовому к выполнению на текущем процессоре. Операционная система выбирает следующий поток для выполнения.

virtual void YieldToSystem() = 0;

Замечания

При вызове прокси-сервера потока, поддерживаемого обычным потоком Windows, YieldToSystem выполняется точно так же, как функция SwitchToThreadWindows. Однако, когда функция вызывается из потоков UMS в пользовательском режиме, она делегирует задачу выбора следующего потока для запуска планировщику пользовательского режима, а не операционной системе. Чтобы добиться желаемого эффекта переключения на другой готовый поток в системе, используйте YieldToSystem.

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

См. также

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