Udostępnij za pośrednictwem


Włókien

światłowod to jednostka wykonywania, która musi być ręcznie zaplanowana przez aplikację. Światłowody działają w kontekście wątków, które je zaplanują. Każdy wątek może planować wiele włókien. Ogólnie rzecz biorąc, włókna nie zapewniają przewagi nad dobrze zaprojektowaną aplikacją wielowątkową. Jednak użycie włókien może ułatwić przenoszenie aplikacji, które zostały zaprojektowane do planowania własnych wątków.

Z punktu widzenia systemu operacje wykonywane przez światłowod są uważane za wykonane przez wątek, który go uruchamia. Jeśli na przykład światłowód uzyskuje dostęp magazynu lokalnego (TLS), uzyskuje dostęp do lokalnego magazynu wątku wątku, który go uruchamia. Ponadto, jeśli światłowod wywołuje funkcję ExitThread, wątek, który go uruchamia, kończy działanie. Jednak światłowod nie ma skojarzonych z nim wszystkich tych samych informacji o stanie, co skojarzone z wątkiem. Jedyne informacje o stanie przechowywane dla włókna to jego stos, podzbiór rejestrów i dane światłowodowe dostarczone podczas tworzenia włókna. Zapisane rejestry są zestawem rejestrów zwykle zachowywanych w wywołaniu funkcji.

Włókna nie są celowo zaplanowane. Planujesz światłowod, przełączając się do niego z innego włókna. System nadal planuje uruchamianie wątków. Gdy wątek działa światłowody jest wywłaszczone, jego obecnie działa światłowod jest wywłaszczone, ale pozostaje wybrany. Wybrane światłowody są uruchamiane po uruchomieniu wątku.

Przed zaplanowaniem pierwszego włókna wywołaj funkcję ConvertThreadToFiber, aby utworzyć obszar, w którym mają być zapisywane informacje o stanie światłowodu. Wątek wywołujący jest teraz wykonywany światłowodem. Przechowywane informacje o stanie dla tego włókna obejmują dane światłowodowe przekazane jako argument do ConvertThreadToFiber.

Funkcja CreateFiber służy do tworzenia nowego włókna na podstawie istniejącego włókna; wywołanie wymaga rozmiaru stosu, adresu początkowego i danych światłowodowych. Adres początkowy jest zazwyczaj funkcją dostarczaną przez użytkownika, nazywaną funkcją fiber, która przyjmuje jeden parametr (dane światłowodowe) i nie zwraca wartości. Jeśli funkcja fiber zwraca, wątek, na którym działa światłowod, kończy się. Aby wykonać dowolne światłowody utworzone za pomocą CreateFiber, wywołaj funkcję SwitchToFiber. Możesz wywołać SwitchToFiber przy użyciu adresu światłowodu utworzonego przez inny wątek. Aby to zrobić, musisz mieć adres zwrócony do innego wątku po wywołaniu CreateFiber i należy użyć odpowiedniej synchronizacji.

Światłowod może pobrać dane światłowodu, wywołując makro GetFiberData. Światłowod może w dowolnym momencie pobrać adres światłowodowy, wywołując makro GetCurrentFiber.

Magazyn lokalny fibre

Światłowody mogą używać magazynu lokalnego światłowodu (FLS), aby utworzyć unikatową kopię zmiennej dla każdego włókna. Jeśli nie nastąpi przełączanie światłowodowe, flS działa dokładnie tak samo jak wątku lokalnego magazynu. Funkcje FLS (FlsAlloc, FlsFree, FlsGetValuei FlsSetValue) manipulują fls skojarzonymi z bieżącym wątkiem. Jeśli wątek wykonuje światłowod i światłowod jest przełączany, FLS jest również przełączany.

Aby wyczyścić dane skojarzone z światłowodem, wywołaj funkcję DeleteFiber. Te dane obejmują stos, podzbiór rejestrów i dane światłowodowe. Jeśli aktualnie uruchomione światłowody wywołuje DeleteFiber, jego wątek wywołuje ExitThread i kończy działanie. Jeśli jednak wybrane światłowody wątku zostaną usunięte przez światłowody uruchomione w innym wątku, wątek z usuniętym włókna może zakończyć się nieprawidłowo, ponieważ stos światłowodowy został uwolniony.

przy użyciu światłowodów