Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Абстракция для потока выполнения на аппаратном уровне.
Синтаксис
struct IExecutionResource;
Участники
Открытые методы
| Имя | Описание |
|---|---|
| IExecutionResource::CurrentSubscriptionLevel (текущий уровень подписки) | Возвращает количество активированных корней виртуального процессора и зарегистрированных внешних потоков, которые в настоящее время связаны с базовым аппаратным потоком, который представляет данный ресурс выполнения. |
| IExecutionResource::GetExecutionResourceId | Возвращает уникальный идентификатор для аппаратного потока, который представляет этот ресурс выполнения. |
| IExecutionResource::GetNodeId | Возвращает уникальный идентификатор узла процессора, к которому принадлежит этот ресурс выполнения. |
| IExecutionResource::Remove | Возвращает этот ресурс выполнения в Resource Manager. |
Замечания
Ресурсы выполнения могут быть автономными или связанными с корнем виртуального процессора. Автономный ресурс выполнения создается, когда поток в вашем приложении создает подписку на поток. Методы ISchedulerProxy::SubscribeThread и ISchedulerProxy::RequestInitialVirtualProcessors создают подписки потоков и возвращают IExecutionResource интерфейс, представляющий подписку. Создание подписки на поток — это способ сообщить диспетчеру ресурсов о том, что данный поток будет участвовать в работе, поставленной в очередь для планировщика, наряду с виртуальными процессорными корнями, которые диспетчер ресурсов назначает планировщику. Resource Manager использует сведения, чтобы избежать чрезмерной синхронизации аппаратных потоков, где он может.
Иерархия наследования
IExecutionResource
Требования
Заголовок: concrtrm.h
Пространство имен: конкурентность
Метод IExecutionResource::CurrentSubscriptionLevel
Возвращает количество активированных корней виртуального процессора и подписанных внешних потоков, которые в настоящее время связаны с базовым потоком оборудования, который представляет этот ресурс выполнения.
virtual unsigned int CurrentSubscriptionLevel() const = 0;
Возвращаемое значение
Текущий уровень подписки.
Замечания
Уровень подписки указывает, сколько запущенных потоков связано с аппаратным потоком. Это включает только потоки, о которых известно Resource Manager, в виде подписанных ресурсов, и корней виртуальных процессоров, которые активно выполняют прокси-потоки.
Вызов метода ISchedulerProxy::SubscribeCurrentThread или метода ISchedulerProxy::RequestInitialVirtualProcessors с параметром doSubscribeCurrentThread, установленным в значение true, увеличивает уровень подписки аппаратного потока на единицу. Также они возвращают IExecutionResource интерфейс, представляющий подписку. Соответствующий вызов IExecutionResource::Remove уменьшает уровень подписки аппаратного потока на один.
Действие активации корня виртуального процессора с помощью метода IVirtualProcessorRoot::Activate увеличивает уровень подписки аппаратной нити на один. Методы IVirtualProcessorRoot::Deactivate или IExecutionResource::Remove уменьшают уровень подписки на единицу при вызове в активированном корне виртуального процессора.
Resource Manager использует сведения о уровне подписки в качестве одного из способов определения времени перемещения ресурсов между планировщиками.
Метод IExecutionResource::GetExecutionResourceId
Возвращает уникальный идентификатор для аппаратного потока, который представляет этот ресурс выполнения.
virtual unsigned int GetExecutionResourceId() const = 0;
Возвращаемое значение
Уникальный идентификатор аппаратного потока, лежащего в основе этого ресурса выполнения.
Замечания
Каждому аппаратному потоку присваивается уникальный идентификатор средой выполнения Concurrency Runtime. Если несколько ресурсов выполнения связаны с аппаратным потоком, они будут иметь один и тот же идентификатор ресурса выполнения.
Метод IExecutionResource::GetNodeId
Возвращает уникальный идентификатор узла процессора, к которому принадлежит этот ресурс выполнения.
virtual unsigned int GetNodeId() const = 0;
Возвращаемое значение
Уникальный идентификатор для узла процессора.
Замечания
Среда выполнения параллельных задач представляет аппаратные потоки в виде групп процессорных узлов на системе. Узлы обычно являются производными от аппаратной топологии системы. Например, все процессоры на определенном сокете или определенном узле NUMA могут принадлежать одному узлу процессора. Resource Manager назначает уникальные идентификаторы этим узлам, начиная с 0 и nodeCount - 1включая, где nodeCount представляет общее количество узлов процессора в системе.
Количество узлов можно получить из функции GetProcessorNodeCount.
Метод IExecutionResource::Remove
Возвращает этот ресурс выполнения в Resource Manager.
virtual void Remove(_Inout_ IScheduler* pScheduler) = 0;
Параметры
pScheduler
Интерфейс планировщика, выполняющего запрос на удаление этого ресурса выполнения.
Замечания
Используйте этот метод для возврата автономных ресурсов выполнения, а также ресурсов выполнения, связанных с корнем виртуального процессора в Resource Manager.
Если это автономный ресурс выполнения, полученный от любого из методов ISchedulerProxy::SubscriptionCurrentThread или ISchedulerProxy::RequestInitialVirtualProcessors, вызов метода Remove завершит подписку потока, которую был создан ресурс для представления. Перед завершением работы прокси-планировщика необходимо завершить подписки всех потоков и вызвать Remove из потока, создавшего эти подписки.
Корни виртуального процессора также могут быть возвращены диспетчеру ресурсов путем вызова метода Remove, поскольку интерфейс IVirtualProcessorRoot наследуется от интерфейса IExecutionResource. Возможно, вам потребуется вернуть корень виртуального процессора в ответ на вызов метода IScheduler::RemoveVirtualProcessors или когда вы завершаете работу с переусердствованным корнем виртуального процессора, полученным через метод ISchedulerProxy::CreateOversubscriber. Для корней виртуального процессора нет ограничений на вызов метода Remove любым потоком.
invalid_argument вызывается, если для параметра pScheduler задано значение NULL.
invalid_operation Выбрасывается, если параметр pScheduler отличается от планировщика, для которого был создан данный ресурс выполнения. В случае с автономным ресурсом выполнения исключение выбрасывается, если текущий поток отличается от потока, который создал подписку на поток.
См. также
Пространство имен параллелизм
Структура IVirtualProcessorRoot