zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    关于append,appendTo,prepend,prependTo的区别
    CSS3 pointer-events:none应用举例及扩展
    jQuery插件的开发(一)
    css3 appearance在iphone上面的问题
    最短路系列
    最小生成树系列
    最大流问题
    poj_1050
    NO TIME, BUT COURAGE, BUT BEAUTY(汇编小程序)
    ubuntu软件与使用
  • 原文地址:https://www.cnblogs.com/gongluck/p/9335492.html
Copyright © 2011-2022 走看看