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


Структура IVirtualProcessorRoot

Абстракция для аппаратного потока, на котором может выполняться поток-прокси.

Синтаксис

struct IVirtualProcessorRoot : public IExecutionResource;

Участники

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

Имя Описание
IVirtualProcessorRoot::Activate Вызывает выполнение потокового прокси, связанного с интерфейсом pContext контекста выполнения, на данном корне виртуального процессора.
IVirtualProcessorRoot::Deactivate Приводит к тому, что прокси-сервер потока, выполняемый в данный момент в корневом каталоге виртуального процессора, перестает отправлять контекст выполнения. Прокси-сервер потока возобновит выполнение при вызове метода Activate.
IVirtualProcessorRoot::EnsureAllTasksVisible Приводит к тому, что данные, хранящиеся в иерархии памяти отдельных процессоров, становятся видимыми для всех процессоров в системе. Это гарантирует, что на всех процессорах выполняется полный барьер памяти перед возвратом метода.
IVirtualProcessorRoot::GetId Возвращает уникальный идентификатор для корня виртуального процессора.

Замечания

У каждого виртуального корня процессора есть связанный ресурс выполнения. Интерфейс IVirtualProcessorRoot наследует от интерфейса IExecutionResource . Несколько корней виртуального процессора могут соответствовать одному и тому же базовому потоку оборудования.

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

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

IExecutionResource

IVirtualProcessorRoot

Требования

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

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

Метод IVirtualProcessorRoot::Activate

Приводит к тому, что прокси потока, связанный с интерфейсом pContext контекста выполнения, начнет выполняться на этом корневом узле виртуального процессора.

virtual void Activate(_Inout_ IExecutionContext* pContext) = 0;

Параметры

pContext
Интерфейс контекста выполнения, который будет выполняться на этом корне виртуального процессора.

Замечания

Resource Manager предоставит прокси потока, если он не связан с интерфейсом контекста выполнения pContext

Этот Activate метод можно использовать для начала выполнения работы на новом корневом виртуальном процессоре, возвращаемом менеджером ресурсов, или для возобновления потокового прокси на корне виртуального процессора, который был деактивирован или будет деактивирован. Дополнительные сведения о деактивации см. в разделе IVirtualProcessorRoot::Deactivate. При возобновлении деактивированного корневого каталога виртуального процессора параметр pContext должен совпадать с параметром, используемым для деактивации корневого каталога виртуального процессора.

После первой активации корня виртуального процессора последующие пары вызовов Deactivate и Activate могут конфликтовать друг с другом. Это означает, что диспетчер ресурсов может получить вызов Activate, прежде чем он получит вызов Deactivate, для которого он был предназначен.

При активации корневого каталога виртуального процессора вы сигнализируете resource Manager о том, что этот корневой каталог виртуального процессора в настоящее время занят работой. Если планировщик не может найти какую-либо работу для выполнения в этом корневом каталоге, он должен вызвать Deactivate метод, сообщающий Resource Manager, что корневой каталог виртуального процессора неактивен. Resource Manager использует эти данные для балансировки нагрузки системы.

invalid_argument вызывается, если аргумент pContext имеет значение NULL.

invalid_operation вызывается, если аргумент pContext не представляет контекст выполнения, который был недавно отправлен этим корнем виртуального процессора.

Действие активации виртуального ядра процессора увеличивает уровень подписки базового аппаратного потока на один. Дополнительные сведения об уровнях подписки см. в разделе IExecutionResource::CurrentSubscriptionLevel.

Метод IVirtualProcessorRoot::Deactivate

Приводит к тому, что прокси-сервер потока, выполняемый в данный момент в корневом каталоге виртуального процессора, перестает отправлять контекст выполнения. Прокси-сервер потока возобновит выполнение при вызове метода Activate.

virtual bool Deactivate(_Inout_ IExecutionContext* pContext) = 0;

Параметры

pContext
Контекст, который в настоящее время отправляется данным корневым элементом.

Возвращаемое значение

Булевое значение. Значение true указывает, что прокси-сервер потока возвращен методом Deactivate в ответ на вызов к методу Activate. Значение false указывает, что прокси потока, возвращенный методом, в ответ на конкретное событие уведомления в Resource Manager. В планировщике потоков в пользовательском режиме (UMS) это означает, что элементы появились в списке завершения планировщика, и планировщик должен обработать их.

Замечания

Используйте этот метод, чтобы временно остановить выполнение виртуального корня процессора, если вы не можете найти никакой работы в планировщике. Вызов метода Deactivate должен вызываться из метода Dispatch в контексте выполнения, с которым в последний раз был активирован корень виртуального процессора. Другими словами, прокси потока, вызывающий метод Deactivate, должен быть тем, который в настоящее время выполняется на корне виртуального процессора. Вызов метода на корне виртуального процессора, на котором вы не исполняетесь, может привести к неопределенному поведению.

Деактивированный корень виртуального процессора может проснуться с вызовом Activate метода с тем же аргументом, который был передан методу Deactivate . Планировщик отвечает за обеспечение парности вызовов методов Activate и Deactivate, но они не обязаны выполняться в определенном порядке. Resource Manager может обрабатывать получение вызова метода Activate до того, как он получает вызов метода Deactivate, для которого он был предназначен.

Если корневой виртуальный процессор просыпается и возвращаемое значение из метода Deactivate является значением false, планировщик должен запрашивать список завершения UMS через метод IUMSCompletionList::GetUnblockNotifications, действовать в соответствии с полученной информацией, а затем снова вызывать метод Deactivate. Это должно повторяться до тех пор, пока метод Deactivate не вернет значение true.

invalid_argument вызывается, если аргумент pContext имеет значение NULL.

invalid_operation Вызывается, если корневой каталог виртуального процессора никогда не был активирован, или аргумент pContext не представляет контекст выполнения, который был недавно отправлен этим корнем виртуального процессора.

Деактивация виртуального процессорного ядра снижает уровень подписки базового аппаратного потока на один. Дополнительные сведения об уровнях подписки см. в разделе IExecutionResource::CurrentSubscriptionLevel.

Метод IVirtualProcessorRoot::EnsureAllTasksVisible

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

virtual void EnsureAllTasksVisible(_Inout_ IExecutionContext* pContext) = 0;

Параметры

pContext
Контекст, который в настоящее время передается этим корневым узлом виртуального процессора.

Замечания

Этот метод может оказаться полезным, если вы хотите синхронизировать деактивацию корня виртуального процессора с добавлением новой работы в планировщик. По соображениям производительности вы можете решить добавить рабочие элементы в планировщик без выполнения барьера памяти, что означает, что рабочие элементы, добавленные потоком, выполняемым на одном процессоре, не сразу видны всем остальным процессорам. Используя этот метод в сочетании с методом Deactivate, вы можете убедиться, что планировщик не деактивирует все корневые виртуальные процессоры, пока существуют рабочие элементы в коллекциях планировщика.

Вызов метода EnsureAllTasksVisibleThe должен исходить из метода Dispatch в контексте выполнения, с которым в последний раз был активирован корень виртуального процессора. Другими словами, прокси потока, вызывающий метод EnsureAllTasksVisible, должен быть тем, который в настоящее время выполняется на корне виртуального процессора. Вызов метода в корневом каталоге виртуального процессора, на который вы не выполняете, может привести к неопределенному поведению.

invalid_argument вызывается, если аргумент pContext имеет значение NULL.

invalid_operation сгенерируется, если корень виртуального процессора никогда не был активирован или аргумент pContext не представляет собой контекст выполнения, который был активирован этим корнем виртуального процессора в последний раз.

Метод IVirtualProcessorRoot::GetId

Возвращает уникальный идентификатор для корня виртуального процессора.

virtual unsigned int GetId() const = 0;

Возвращаемое значение

Целочисленный идентификатор.

См. также

Пространство имен параллелизм