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


Волокон

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

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

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

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

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

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

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

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

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

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