![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
并发
文章平均质量分 80
maohuazhu
后台开发工程师,编程爱好者。GitHub:https://github.com/neal-zhu
展开
-
使用 ucontext 实现用户态线程(下)
前面的文章介绍了 ucontext 相关函数的基本作用,我们已经知道如何用 getcontext 等函数实现基本的函数 yield & resume 的操作了。下面来看看如何实现一个简陋的用户态线程库吧!首先来看我们 thread 的定义:#define STACK_SIZE 4096typedef struct thread thread_t;struct thread { char stack[STACK_SIZE]; /* 协程运行栈 */ ucontext_t c原创 2021-02-06 12:04:21 · 348 阅读 · 1 评论 -
使用 ucontext 实现用户态线程(上)
用户态线程,或者称之为协程,因为具有更好的扩展性,在现在的服务端编程中越来越受到重视。今天的文章会介绍在 linux 系统下,如何使用 ucontext 来实现协程库。用户态实现线程库其实有两个常见的选择,其一是 setjmp,但是因为其要想做到协程之间的栈隔离,需要使用汇编语言,实在非大多数程序员所长,这里就不展开介绍了。另一个方案就是本文的主角 ucontext。来看一下今天的主角: #include <ucontext.h> int getcon原创 2021-02-05 21:37:30 · 389 阅读 · 0 评论 -
手撸一个用户态线程库-为什么要使用协程(用户态线程)
本系列文章旨在带大家手撸一个简单的用户态线程(协程)库。本系列文章假设大家对多线程编程、EDSM(reactor 架构)有一定了解,所以并不会花太多精力去讲解这些内容。用户态线程,或者叫协程,越来越受到重视。这是为什么呢?多线程怎么就不香了呢?用户态为什么要重新造轮子,费劲的去实现一个用户态线程库呢?这背后到底是到的的沦丧,还是 KPI 的扭曲?下面我们来简单探讨一下。多线程编程的局限传统的多线程网络编程中,往往会使用一个内核线程来完整处理一个用户请求,大概伪代码如下:void HandleConn原创 2020-12-16 23:35:52 · 480 阅读 · 0 评论 -
一个线程安全的 lrucache 实现 --- 读 leveldb 源码
缓存是计算机的每一个层次中都是一个非常重要的概念,缓存的存在可以大大提高软件的运行速度。Least Recently Used(lru) cache 即最近最久未使用的缓存,多见与页面置换算法,lru 缓存算法在缓存的大小达到最大值之后,换出最早未被使用的缓存。在阅读 leveldb 的源代码的时候,发现其中的 cache 类正是一个线程安全的 lru-cache 实现,代码非常优雅。笔者读完之...原创 2018-03-10 23:49:24 · 1635 阅读 · 0 评论 -
并发编程:当IO复用遇到消息队列
在并发编程中,多线程模型占有举足轻重的地位,而消息队列,又是多线程编程中解决数据竞争的一个神兵利器。通过一个多线程安全的队列,可以简单而高效的实现线程之间的交互,同时不会引入太复杂的编码逻辑。 而IO复用,不管是 select,poll 还是 epoll,解决的都是同一个问题---在一个线程内非阻塞的去处理多个 IO 事件(值得注意的是,非阻塞IO与异步IO不是一个概念,其中亦有区别...原创 2018-02-25 23:00:13 · 540 阅读 · 0 评论