Aracılığıyla paylaş


Lif

fiber, uygulama tarafından el ile zamanlanması gereken bir yürütme birimidir. Fiberler, bunları zamanlayan iş parçacıkları bağlamında çalışır. Her iş parçacığı birden çok fiber zamanlayabilir. Genel olarak, lifler iyi tasarlanmış çok iş parçacıklı bir uygulamaya göre avantaj sağlamaz. Ancak, fiberleri kullanmak, kendi iş parçacıklarını zamanlamak için tasarlanmış uygulamaları taşımayı kolaylaştırabilir.

Sistem açısından, bir fiber tarafından gerçekleştirilen işlemlerin onu çalıştıran iş parçacığı tarafından gerçekleştirildiği kabul edilir. Örneğin, bir fiber iş parçacığı yerel depolama (TLS) erişiyorsa, onu çalıştıran iş parçacığının yerel iş parçacığı depolama alanına erişir. Ayrıca, bir fiber ExitThread işlevini çağırırsa, onu çalıştıran iş parçacığı çıkar. Bununla birlikte, bir fiberin kendisiyle ilişkili durum bilgilerinin tümü, bir iş parçacığıyla ilişkili olanla aynı değildir. Bir fiber için tutulan tek durum bilgisi yığını, yazmaçlarının bir alt kümesi ve fiber oluşturma sırasında sağlanan fiber verileridir. Kaydedilen yazmaçlar genellikle bir işlev çağrısında korunan yazmaç kümesidir.

Fiberler önceden zamanlanmış değildir. Bir fiberi başka bir fiberden geçirerek zamanlayabilirsiniz. Sistem hala iş parçacıklarını çalışacak şekilde zamanlar. Fiber çalıştıran bir iş parçacığı ön işaretli olduğunda, şu anda çalışan fiberi önlenir ancak seçili kalır. Seçilen fiber, iş parçacığı çalıştırıldığında çalışır.

İlk fiberi zamanlamadan önce, fiber durum bilgilerinin kaydedildiği bir alan oluşturmak için ConvertThreadToFiber işlevini çağırın. Çağıran iş parçacığı artık şu anda yürütülmekte olan fiberdir. Bu fiber için depolanan durum bilgileri, ConvertThreadToFiberbağımsız değişkeni olarak geçirilen fiber verileri içerir.

CreateFiber işlevi, mevcut bir fiberden yeni bir fiber oluşturmak için kullanılır; çağrısı yığın boyutunu, başlangıç adresini ve fiber verileri gerektirir. Başlangıç adresi genellikle bir parametre (fiber veri) alan ve değer döndürmeyen, fiber işlevi olarak adlandırılan, kullanıcı tarafından sağlanan bir işlevdir. Fiber işleviniz döndürülüyorsa, fiberi çalıştıran iş parçacığından çıkılır. CreateFiberile oluşturulan fiberleri yürütmek için SwitchToFiber işlevini çağırın. SwitchToFiber farklı bir iş parçacığı tarafından oluşturulan bir fiberin adresiyle çağırabilirsiniz. Bunu yapmak için, adresin CreateFiber çağrıldığında diğer iş parçacığına döndürülebilmesi ve uygun eşitlemeyi kullanmanız gerekir.

Fiber, GetFiberDatamakrosununçağırarak fiber verileri alabilir. Fiber, getCurrentFibermakrosununçağırarak fiber adresini istediği zaman alabilir.

Fiber Yerel Depolama

Fiber, her fiber için bir değişkenin benzersiz bir kopyasını oluşturmak için fiber yerel depolama (FLS) kullanabilir. Fiber anahtarlama gerçekleşmezse FLS, iş parçacığı yerel depolamaile tam olarak aynı şekilde davranır. FLS işlevleri (FlsAlloc, FlsFree, FlsGetValueve FlsSetValue) geçerli iş parçacığıyla ilişkilendirilmiş FLS'yi düzenler. İş parçacığı bir fiber yürütürse ve fiber değiştirilirse, FLS de değiştirilir.

Fiber ile ilişkili verileri temizlemek için DeleteFiber işlevini çağırın. Bu veriler yığını, yazmaçların bir alt kümesini ve fiber verileri içerir. Şu anda çalışan fiber deleteFiber çağırırsa, iş parçacığı ExitThreadçağırır ve sonlandırılır. Ancak, bir iş parçacığının seçili lifi başka bir iş parçacığında çalışan bir fiber tarafından silinirse, fiber yığını serbest bırakılmış olduğundan silinen fibere sahip iş parçacığı anormal şekilde sonlandırılır.

Fiber Kullanarak