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;
}
posted @ 2018-07-19 14:12  gongluck  阅读(277)  评论(0编辑  收藏  举报