利用ucontext.h中接口实现用户级别线程库

本文介绍了如何利用ucontext.h中的接口实现一个简单的用户级别线程库。通过学习getcontext、setcontext和swapcontext等API,配合C++11,创建线程类并实现线程调度。示例展示了线程交替打印hello和world,展现了用户级线程的基本功能。
摘要由CSDN通过智能技术生成

想必大家在初次接触多线程或多进程时一定会感觉这是多么的神奇!一个程序居然可以“同时”执行好多工作,此时你一定有一探其究竟的想法吧?可是无奈,这些都是内核中十分复杂的代码。对于初入计算机大门的我们,去看那些东西,的确有些困难。但是不用灰心,本篇博文我将为大家介绍一个由我自己实现的简单线程,代码也就100多行,程序还很简陋,但是我感觉这有助于我们对进程或线程的理解

1.设计思路

要实现线程,那么就先得有个简单的设计思路,具体有如下几步

.实现能够保存当前上下文的功能函数,并实现能够将当前程序运行切向某个函数的功能函数。如果自己要做到这点,一定会很麻烦,也不简
单,好在ucontext.h头文件中为我们提供了该类功能函数的API
.如何进行线程调度?我采用了传统的时间片轮训,设置一个定时器,当定时器触发时,将会触发信号处
理函数(即调度函数)

我想能够实现上述俩点,那么实现线程这项工作剩下的也都是些细枝末叶了

2.前期知识准备

要完成1中的第一点,我们只需要学习一下ucontext.h为我们提供的几个API接口的使用即可
具体如下

1.获取当前运行程序上下文的API
int getcontext(ucontext_t *ucp);
//失败返回-1

ucontext_t结构体定义如下

 typedef struct ucontext {
               struct ucontext *uc_link;
               sigset_t         uc_sigmask;
               stack_t          uc_stack;
               mcontext_t       uc_mcontext;
               ...
           } ucontext_t;

该接口可获取当前程序上下文并将其保存到ucp中

2.将当前程序切换到某个上下文处的API
 int setcontext(const ucontext_t *ucp);

该API会将当前程序所运行的地方切换至ucp指向的上下文处

具体实例如下

#include <stdio.h>
#include <ucontext.h>
#include <unistd.h>

int main(int argc, char *argv[]) {
  ucontext_t context;

  //获取当前程序上下文
  getcontext(&context);
  puts("Hello world");
  sleep(1);
  //将程序切换至context指向的上下文处
  setcontext(&context);
  return 0;
}

该程序执行结果如下
这里写图片描述

你可能会惊讶的发现这杂么成了一个无线循环了!其实只要你理解了上面介绍的俩个API这一点都不奇怪
上述代码中我们先用getcontext获取其所在位置的程序上下文,之后程序往下执行,当执行到setcontext时,我们上面以介绍过他的功能,其会将当前执行程序的位置挪到我们之前保存下来的程序上下文context的内容,所以执行完此条语句后程序又会回到getcontext所在的语句处,也因此这段代码成了一个无限循环了

3.swapcontext
int swapcontext(ucontext_t *oucp, const ucontext_t *ucp);

该接口融合了上述介绍的1,2俩个接口的功能
我们可以将其功能理解为
首先执行getcontext(oucp);
然后执行setcontext(ucp);

4.将当前上下文入口改为某个函数入口的API
void makecontext(ucontext_t *ucp, void (*func)(), int argc, ...);

将API会将当前上下文ucp入口切换为func函数的额入口,及如果我们执行了setcontext(ucp)后,程序会去执行func函数
具体实例如下

   #include <stdio.h>
   
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值