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


Волокон

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

С точки зрения системы операции, выполняемые волокнами, считаются выполненными потоком, выполняющим его. Например, если оптоволоконный доступ к локальному хранилищу потока (TLS), он обращается к локальному хранилищу потока, запущенного в нем. Кроме того, если волокно вызывает функцию ExitThread, поток, выполняющий его, завершает работу. Тем не менее, волокна не имеют всех одинаковых сведений о состоянии, связанных с ним, как это связано с потоком. Единственной информацией о состоянии, поддерживаемой для волокна, является его стек, подмножество его регистров и данные волокна, предоставляемые во время создания волокна. Сохраненные регистры — это набор регистров, которые обычно сохраняются во время вызова функции.

Волокна не заранее запланированы. Вы планируете волокна, переключившись на него из другого волокна. Система по-прежнему планирует выполнение потоков. Когда поток, выполняющий волокна, преумножен, его текущее работающее волокна преумножено, но остается выбранным. Выбранное волокно выполняется при выполнении потока.

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

Функция CreateFiber используется для создания нового волокна из существующего волокна; Для вызова требуется размер стека, начальный адрес и данные волокна. Начальный адрес обычно является пользовательской функцией, называемой функцией волокна, которая принимает один параметр (данные волокна) и не возвращает значение. Если функция волокна возвращается, поток, выполняющий волокна, завершает работу. Чтобы выполнить любое волокна, созданное с помощью CreateFiber, вызовите функцию SwitchToFiber. Можно вызвать SwitchToFiber с адресом волокна, созданного другим потоком. Для этого необходимо вернуть адрес другому потоку при вызове CreateFiber и использовать правильную синхронизацию.

Волокно может получить данные волокна, вызвав макрос GetFiberData. Волокно может получить адрес волокна в любое время, вызвав макрос GetCurrentFiber.

Локальное хранилище Fibre

Волокно может использовать локальное хранилище волокна (FLS) для создания уникальной копии переменной для каждого волокна. Если переключение волокон не происходит, FLS действует точно так же, как локальное хранилище потока. Функции FLS (FlsAlloc, FlsFree, FlsGetValueи FlsSetValue) управляют FLS, связанными с текущим потоком. Если поток выполняет волокна и переключится волокна, то FLS также переключается.

Чтобы очистить данные, связанные с волокнами, вызовите функцию DeleteFiber. Эти данные включают стек, подмножество регистров и данные волокна. Если в настоящее время выполняется вызов волокна DeleteFiber, поток вызывает ExitThread и завершает работу. Однако если выбранное волокна потока удаляется волокнами, работающими в другом потоке, поток с удаленным волокнам, скорее всего, завершается ненормально, так как стек волокон был освобожден.

использование волокон