섬유
파이버는 애플리케이션에서 수동으로 예약해야 하는 실행 단위입니다. 파이버는 예약하는 스레드의 컨텍스트에서 실행됩니다. 각 스레드는 여러 파이버를 예약할 수 있습니다. 일반적으로 섬유는 잘 설계된 다중 스레드 애플리케이션에 비해 이점을 제공하지 않습니다. 그러나 파이버를 사용하면 자체 스레드를 예약하도록 설계된 애플리케이션을 쉽게 이식할 수 있습니다.
시스템 관점에서 파이버에서 수행하는 작업은 이를 실행하는 스레드에 의해 수행된 것으로 간주됩니다. 예를 들어 파이버가 TLS( 스레드 로컬 스토리지 )에 액세스하는 경우 이를 실행하는 스레드의 스레드 로컬 스토리지에 액세스합니다. 또한 파이버가 ExitThread 함수를 호출하면 실행 중인 스레드가 종료됩니다. 그러나 파이버에는 스레드와 연결된 것과 연결된 상태 정보가 모두 없습니다. 섬유에 대해 유지 관리되는 유일한 상태 정보는 스택, 레지스터의 하위 집합 및 섬유 생성 중에 제공되는 파이버 데이터입니다. 저장된 레지스터는 일반적으로 함수 호출에서 유지되는 레지스터 집합입니다.
섬유는 선제적으로 예약되지 않습니다. 다른 섬유에서 파이버로 전환하여 섬유를 예약합니다. 시스템은 여전히 스레드를 실행하도록 예약합니다. 파이버를 실행하는 스레드가 선점되면 현재 실행 중인 파이버가 선점되지만 선택된 상태로 유지됩니다. 선택한 파이버는 스레드가 실행될 때 실행됩니다.
첫 번째 파이버를 예약하기 전에 ConvertThreadToFiber 함수를 호출하여 파이버 상태 정보를 저장할 영역을 만듭니다. 호출 스레드는 현재 실행 중인 파이버입니다. 이 파이버의 저장된 상태 정보에는 ConvertThreadToFiber에 인수로 전달된 파이버 데이터가 포함됩니다.
CreateFiber 함수는 기존 파이버에서 새 파이버를 만드는 데 사용됩니다. 호출에는 스택 크기, 시작 주소 및 파이버 데이터가 필요합니다. 시작 주소는 일반적으로 하나의 매개 변수(파이버 데이터)를 사용하고 값을 반환하지 않는 파이버 함수라고 하는 사용자 제공 함수입니다. 파이버 함수가 반환되면 파이버를 실행하는 스레드가 종료됩니다. CreateFiber를 사용하여 만든 파이버를 실행하려면 SwitchToFiber 함수를 호출합니다. 다른 스레드에서 만든 파이버의 주소로 SwitchToFiber 를 호출할 수 있습니다. 이렇게 하려면 CreateFiber 를 호출할 때 주소가 다른 스레드로 반환되어야 하며 적절한 동기화를 사용해야 합니다.
파이버가 GetFiberData 매크로를 호출하여 파이버 데이터를 검색할 수 있습니다. 파이버가 언제든지 GetCurrentFiber 매크로를 호출하여 파이버 주소를 검색할 수 있습니다.
섬유는 FLS( 파이버 로컬 스토리지 )를 사용하여 각 섬유에 대한 변수의 고유한 복사본을 만들 수 있습니다. 파이버 전환이 발생하지 않으면 FLS는 스레드 로컬 스토리지와 정확히 동일하게 작동합니다. FLS 함수(FlsAlloc, FlsFree, FlsGetValue 및 FlsSetValue)는 현재 스레드와 연결된 FLS를 조작합니다. 스레드가 파이버를 실행하고 파이버가 전환되면 FLS도 전환됩니다.
파이버와 연결된 데이터를 클린 DeleteFiber 함수를 호출합니다. 이 데이터에는 스택, 레지스터의 하위 집합 및 파이버 데이터가 포함됩니다. 현재 실행 중인 파이버가 DeleteFiber를 호출하는 경우 스레드는 ExitThread 를 호출하고 종료합니다. 그러나 선택한 스레드의 섬유가 다른 스레드에서 실행되는 파이버에 의해 삭제되면 섬유 스택이 해제되었기 때문에 삭제된 파이버가 있는 스레드가 비정상적으로 종료될 수 있습니다.