Нити


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

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

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

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

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

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

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

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

Назад в оглавление темы
На главную страницу темы

Hosted by uCoz