您现在的位置是:首页 > Linux OSLinux OS
简单的一段c++根据栈实现的协程
比目鱼2021-12-11【Linux OS】人已围观
简介#include <stdio.h>#include <stdlib.h>#define STACK_SIZE 1024typedef void(*coro_start)();class coroutine {public: long* stack_pointer; char* stack; coro
#include <stdio.h> #include <stdlib.h> #define STACK_SIZE 1024 typedef void(*coro_start)(); class coroutine { public: long* stack_pointer; char* stack; coroutine(coro_start entry) { if (entry == NULL) { stack = NULL; stack_pointer = NULL; return; } stack = (char*)malloc(STACK_SIZE); char* base = stack + STACK_SIZE; stack_pointer = (long*) base; stack_pointer -= 1; *stack_pointer = (long) entry; stack_pointer -= 1; *stack_pointer = (long) base; } ~coroutine() { if (!stack) return; free(stack); stack = NULL; } }; coroutine* co_a, * co_b; void yield_to(coroutine* old_co, coroutine* co) { __asm__ ( "movq %%rsp, %0\n\t" "movq %%rax, %%rsp\n\t" :"=m"(old_co->stack_pointer):"a"(co->stack_pointer):); } void start_b() { printf("B"); yield_to(co_b, co_a); printf("D"); yield_to(co_b, co_a); } int main() { printf("A"); co_b = new coroutine(start_b); co_a = new coroutine(NULL); yield_to(co_a, co_b); printf("C"); yield_to(co_a, co_b); printf("E\n"); delete co_a; delete co_b; return 0; }
Tags:
很赞哦! ()
随机图文
Linux 中断所有知识点
GIC,Generic Interrupt Controller。是ARM公司提供的一个通用的中断控制器。主要作用为:接受硬件中断信号,并经过一定处理后,分发给对应的CPU进行处理。 当前GIC 有四个版本,GIC v1~v4, 本文主要介绍GIC v3控制器。Linux 内核的网络协议栈
本文主要记录 Linux 内核网络协议栈的运行原理一文搞定 | Linux共享内存原理
在Linux系统中,每个进程都有独立的虚拟内存空间,也就是说不同的进程访问同一段虚拟内存地址所得到的数据是不一样的,这是因为不同进程相同的虚拟内存地址会映射到不同的物理内存地址上。 但有时候为了让不同进程之间进行通信,需要让不同进程共享相同的物理内存,Linux通过 共享内存 来实现这个功能。下面先来介绍一下Linux系统的共享内存的使用。Linux 中断的底裤之 workqueue
workqueue 是除了 softirq 和 tasklet 以外最常用的下半部机制之一。workqueue 的本质是把 work 交给一个内核线程,在进程上下文调度的时候执行。因为这个特点,所以 workqueue 允许重新调度和睡眠,这种异步执行的进程上下文,能解决因为 softirq 和 tasklet 执行时间长而导致的系统实时性下降等问题。