Windows核心编程:第12章 纤程
Github
https://github.com/gongluck/Windows-Core-Program.git
//第12章 纤程.cpp: 定义应用程序的入口点。
//
#include "stdafx.h"
#include "第12章 纤程.h"
LPVOID g_Covert = nullptr;
DWORD g_index = 0;
VOID WINAPI FiberFun(LPVOID lpFiberParameter)
{
	//纤程参数
	LPVOID pFiberCurrent = GetCurrentFiber();
	BOOL bres = IsThreadAFiber();
	LPVOID pCurrentData = GetFiberData();//获取创建纤程时传递的参数,pCurrentData==lpFiberParameter==555
	//纤程局部存储区
	bres = FlsSetValue(g_index, (PVOID)200);
	PVOID flsvalue = FlsGetValue(g_index);
	SwitchToFiber(g_Covert);
}
VOID NTAPI FlsFun(IN PVOID lpFlsData)
{
	//FlsSetValue多少次,系统调用FlsFun就多少次
	//可以主动调用FlsFree删除Fls槽
	//纤程销毁时也会调用FlsFun
}
int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
	_In_opt_ HINSTANCE hPrevInstance,
	_In_ LPWSTR    lpCmdLine,
	_In_ int       nCmdShow)
{
	//将线程转换为纤程
	LPVOID pFiberCovert = ConvertThreadToFiberEx(nullptr, FIBER_FLAG_FLOAT_SWITCH);
	g_Covert = pFiberCovert;
	//纤程局部存储区
	g_index = FlsAlloc(FlsFun);
	BOOL bres = FlsSetValue(g_index, (PVOID)100);
	PVOID flsvalue = FlsGetValue(g_index);
	//创建纤程
	LPVOID pFiberCreate = CreateFiberEx(0, 0, FIBER_FLAG_FLOAT_SWITCH, FiberFun, (LPVOID)555);
	//切换纤程
	SwitchToFiber(pFiberCreate);
	bres = FlsFree(g_index);
	
	//销毁纤程
	DeleteFiber(pFiberCreate);
	//解除线程的纤程状态
	bres = ConvertFiberToThread();
	system("pause");
	return 0;
}
                    
                
                
            
        
浙公网安备 33010602011771号