文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

纤程与协程的区别

2024-11-30 04:44

关注

纤程是一种比线程更轻量级的执行单元,它可以在一个线程中切换执行,不需要操作系统内核的干预。纤程可以用来实现异步任务,避免了创建新线程的开销。纤程也叫做协程(coroutine),是一种用户态的多任务机制。

协程与纤程主要的区别点:

一个简单的纤程程序,创建两个纤程并在它们之间切换:

#include "pch.h"
#include 
#include 
#include 

#define FIBER_COUNT 2

LPVOID g_lpFiber[FIBER_COUNT] = {};

VOID WINAPI FiberFun(LPVOID pParam) //纤程函数的返回类型为VOID,并不是因为返回值没有意义,而是因为这个函数不应该返回!
{
    int nFiberIndex = (int)pParam;
    while (true)
    {
        std::cout << "Fiber" << nFiberIndex << std::endl;
        SwitchToFiber(g_lpFiber[1 - nFiberIndex]); //切换到另一个纤程
    }
}

int _tmain(int argc, _TCHAR* argv[])
{
    LPVOID lpMainFiber = ConvertThreadToFiber(NULL); //将当前线程转换为主纤程
    if (lpMainFiber == NULL)
    {
        std::cout << "ConvertThreadToFiber failed" << std::endl;
        return -1;
    }

    for (int i = 0; i < FIBER_COUNT; i++)
    {
        g_lpFiber[i] = CreateFiber(0, FiberFun, (LPVOID)i); //创建子纤程
        if (g_lpFiber[i] == NULL)
        {
            std::cout << "CreateFiber failed" << std::endl;
            return -1;
        }
    }

    SwitchToFiber(g_lpFiber[0]); //切换到第一个子纤程

    for (int i = 0; i < FIBER_COUNT; i++)
    {
        DeleteFiber(g_lpFiber[i]); //删除子纤程
    }

    ConvertFiberToThread(); //将主纤程转换回线程

    return 0;
}

一个使用纤程实现协同程序的例子:

#include 
#include 

#define MAX_FIBERS 3

DWORD dwCounter;

void WINAPI MyFunc(LPVOID lpParameter)
{
 DWORD dwIndex;

 dwIndex = *(DWORD *)lpParameter;

 while(TRUE)
 {
  printf("dwCounter=%d,dwIndex=%d\n",dwCounter,dwIndex);
  dwCounter++;
  SwitchToFiber(lpParameter);
 }
}

void main()
{
 LPVOID lpMainAddress;
 LPVOID lpAddress[MAX_FIBERS];
 DWORD dwParameter[MAX_FIBERS];
 int i;

 lpMainAddress=ConvertThreadToFiber(NULL);

 for(i=0;i

尽管协程的概念早于线程,但协程的实现并不是所有操作系统原生支持的。目前,很多编程语言都是通过自己的运行时环境来模拟协程,利用线程技术来实现协程的调度。这些语言中,像 golang 这样的语言在实现上比较成熟,可以支持大量的协程同时执行,这也是 golang 能够处理高并发的原因之一。

在 golang 中,协程的实现是基于线程的,它维护了一个协程队列,由多个线程来负责执行协程队列中的任务。当一个协程在执行过程中遇到了阻塞操作,比如等待 IO 数据返回,它会被放入一个阻塞队列中,等待 IO 数据返回后再继续执行。在这个过程中,当前线程会去执行队列中的其他协程,从而实现协程之间的切换。

来源:coding日记内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯