setjmp和longjmp函数使用

news2024/11/23 7:03:41

这里用最简单直接的描述:这两组函数是用于实现类似vscode全局的标签跳转功能,setjmp负责埋下标签,longjmp负责标签跳转。

#include <stdio.h>
#include <stdlib.h>
#include <setjmp.h>


jmp_buf envbuf1;
jmp_buf envbuf2;

void func_label1()
{
	int ret = setjmp(envbuf1);
	printf("func label1 ret:%d.\n",ret);
}

void func_label2()
{
	int ret = setjmp(envbuf2);
	printf("func label2 ret:%d.\n",ret);
}

void test1()
{
	printf("test1 called.\n");
	longjmp(envbuf1,100);
	printf("test1 never run here.\n");
}

void test2()
{
	printf("test2 called.\n");
	longjmp(envbuf1,200);
	printf("test2 never run here.\n");
}

void test3()
{
	printf("test3 called.\n");
	longjmp(envbuf1,300);
	printf("test3 never run here.\n");
}

void test4()
{
	printf("test4 called.\n");
	longjmp(envbuf2,400);
	printf("test4 never run here.\n");
}


void test5()
{
	printf("test5 called.\n");
	longjmp(envbuf2,500);
	printf("test5 never run here.\n");
}


void main()
{
	printf("==========Start process======\n");
	func_label1();
	func_label2();
	test1();//label1
	test2();
	test3();
	test4();//label2
	test5();
	printf("==========End process======\n");
}

运行效果:

从这个运行结果可以清楚的看到两个标签的跳转效果!

#include <stdio.h>
#include <unistd.h>
#include <setjmp.h>
#include <stdlib.h>

typedef struct
{
    void *private_data;
    void (*start)(void *);
    jmp_buf context; // 上下文切换

} context;

static context *task_list;
static int run_index = 0;
static int index_max = 0;
static int count = 0;

static void task0(void *arg)
{
    printf("task0,arg=%d\n", arg);
}

static void task1(void *arg)
{
    printf("task1,arg=%d\n", arg);
}

static void task2(void *arg)
{
    printf("task2,arg=%d\n", arg);
}


static void run(context *ct)
{
    printf("run_index=%d, count=%d\n", run_index, ++count);
    ct->start(ct->private_data);   
    run_index = count % index_max;    
    sleep(1);
    longjmp(task_list[run_index].context, 1);//switch to next task
}

void task_init(int size)
{
    task_list = (context *)malloc(size * sizeof(context));
}

void create_task(void (*start)(void *), void *arg)
{
    task_list[index_max].start = start;
    task_list[index_max].private_data = arg;
    if (setjmp(task_list[index_max].context))
    {
        run(&task_list[run_index]);
    }
    index_max++; // 记录创建的任务数量
}

void task_start()
{
    longjmp(task_list[0].context, 1); // 开始第一个任务
}

int main()
{
    task_init(3); // thread max=3
    create_task(task0, (void *)100);
    create_task(task1, (void *)101);
    create_task(task2, (void *)102);
    task_start();
    return 0;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1893842.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

669分,武汉市第四十九中传来喜讯,璞公英「教师增值评价系统」助力学业提升!

星光熠熠&#xff0c;梦想启航 武汉第四十九中学传来喜讯&#xff01; 高三&#xff08;5&#xff09;班物理类考生潘俊安同学 以总分669分的优异成绩脱颖而出&#xff01; 潘俊安同学不仅实现了自我超越&#xff0c; 更为学校的高考历史增添了浓墨重彩的一笔。 三年磨一…

MTK6769芯片性能参数_MT6769规格书_datasheet

联发科MT6769处理器采用了台积电12nm工艺。它具有8核CPU&#xff0c;采用2Cortex A75 2.0GHz 6Cortex A55 1.7GHz的构架。该处理器搭载了Mali-G52 MC2 GPU&#xff0c;运行速度高达820MHz&#xff0c;能够提供出色的图形处理性能。此外&#xff0c;MT6769还提供高达8GB的快速L…

Prometheus 监控Kubelet的运行状态

kubelet通过/metrics暴露自身的指标数据。kubelet有两个端口都提供了这个url&#xff0c;一个是安全端口&#xff08;10250&#xff09;&#xff0c;一个是非安全端口&#xff08;10255&#xff0c;kubeadm安装的集群该端口是关闭的&#xff09;。安全端口使用https协议&#x…

盘点几款国产AI高效神器!打工人赶紧码住

在这个AI技术飞速发展的时代&#xff0c;国产AI工具正成为提升工作效率的得力助手。作为AI工具测评博主&#xff0c;米兔有幸体验了多款国产AI工具&#xff0c;今天要向大家介绍几款超级好用的AI工具。这些工具不仅功能强大&#xff0c;而且操作简便&#xff0c;是职场人士不可…

# windows 安装 mysql 显示 no packages found 解决方法

windows 安装 mysql 显示 no packages found 解决方法 一、问题描述&#xff1a; 安装 mysql 时&#xff0c;出现 no packages found 不能进行下一步安装了&#xff0c; 如下图&#xff1a; 二、解决方法&#xff1a; 1、路径问题&#xff0c;系统不能识别你的安装包路径&…

航空数据管控系统-②项目分析与设计:任务1:需求分析-项目场景引入

任务描述 知识点&#xff1a;需求分析 重 点&#xff1a;原型设计工具&#xff0c;用例图&#xff0c;流程图绘制工具 难 点&#xff1a;功能点的梳理 内 容&#xff1a;完成本次实训项目的需求分析 先共同讨论处本项目的主要功能模块&#xff0c;并确定每个模块的负责…

ClickHouse概述

ClickHouse概述 文章目录 ClickHouse概述ClickHouse是什么ClickHouse快的理由什么是OLAPClickHouse的特点列式存储DBMS 的功能多样化引擎高吞吐写入能力数据分区与线程级并行 ClickHouse的应用合适场景不适合场景 ClickHouse是什么 ClickHouse 是俄罗斯的 Yandex 于 2016 年开…

Axure教程:App侧边抽屉菜单交互制作

今天给大家示范一下抽屉菜单在Axure中的做法。在抽屉式菜单中&#xff0c;要实现两个交互效果&#xff0c;分别是&#xff1a; 交互一 抽屉菜单中1、2级菜单项的伸缩效果 实现逻辑&#xff1a;设置动态面板的切换状态及“推动/拉动原件”实现 交互二 菜单项的选中状态切换 …

20240705 每日AI必读资讯

&#x1f4da;Retool 刚刚发布了最新2024上半年《人工智能现状报告》 - 收集了约750名技术人员的意见 - 包括开发者、数据团队和各行业的领导者&#xff0c;了解如何利用人工智能产生真正的影响。 &#x1f517; 2024上半年《人工智能现状报告》Retool刚刚发布了最新-CSDN b…

目标和问题:从回溯到动态规划的旅程

目录 引言 题目描述 示例 初步思路&#xff1a;回溯法 回溯法实现 分析 转变思路&#xff1a;动态规划 问题转换 状态定义 状态转移方程 二维动态规划实现 压缩到一维动态规划 一维动态规划实现 详细讲解&#xff1a;从回溯到动态规划的旅程 1. 从回溯到动态规划…

AGI 之 【Hugging Face】 的【Transformer】的 [ 解码器 ] / [ 认识 Transformer ]的简单整理

AGI 之 【Hugging Face】 的【Transformer】的 [ 解码器 ] / [ 认识 Transformer ]的简单整理 目录 AGI 之 【Hugging Face】 的【Transformer】的 [ 解码器 ] / [ 认识 Transformer ]的简单整理 一、简单介绍 二、Transformer 三、解码器 四、认识Transformer 1、Transf…

io_contextttttttttttt

创建上下文——io_context_t 它是一个上下文结构&#xff0c;在内部它包含一个完成队列&#xff0c;在线程之间是可以共享的。 提交请求——iocb io回调数据结构&#xff0c;和io_submit配合使用。 处理结果 通过io_event处理结果&#xff0c; struct io_event {void *data…

智胜未来:AI如何重塑SaaS用户增长战略

在当今这个数字化时代&#xff0c;SaaS&#xff08;软件即服务&#xff09;已成为企业运营的重要支柱&#xff0c;而人工智能&#xff08;AI&#xff09;技术的迅猛发展&#xff0c;正以前所未有的方式重塑着SaaS行业的面貌&#xff0c;特别是对其用户增长战略产生了深远影响。…

洛谷P7044 「MCOI-03」括号(栈括号的贡献 组合数经典问题)

题目 思路来源 P7044 「MCOI-03」括号 题解 - 洛谷专栏 题解 统计一对括号的贡献&#xff0c;对于一个左括号i&#xff0c;找到其右第一个匹配的括号的位置j 这样对于不包含这个(i,j)对的区间[l,r]&#xff08;1<l<i&#xff0c;i<r<j&#xff09;来说&#xff…

在docker配置Nginx环境配置

应用于商业模式集中&#xff0c;对于各种API的调用&#xff0c;对于我们想要的功能进行暴露&#xff0c;对于不用的进行拦截进行鉴权。用于后面的付费 开发环境 正式上线模式 一、常用命令 停止&#xff1a;docker stop Nginx重启&#xff1a;docker restart Nginx删除服务&a…

【已解决】ip2region解析ip获取地区位置 在linux部署出现java文件操作报错:java.io.FileNotFoundException

1、依赖 <dependency><groupId>org.lionsoul</groupId><artifactId>ip2region</artifactId><version>2.7.0</version></dependency>2.加入ip2region.xdb文件 ip2Region下载地址 3.加入到项目里面去 把 ip2region.xdb 文件放…

Windows环境使用SpringBoot整合Minio平替OSS

目录 配置Minio环境 一、下载minio.exe mc.exe 二、设置用户名和密码 用管理员模式打开cmd 三、启动Minio服务器 四、访问WebUI给的地址 SpringBoot整合Minio 一、配置依赖&#xff0c;application.yml 二、代码部分 FileVO MinioConfig MinioUploadService MinioController 三…

Python (Ansbile)脚本高效批量管理服务器和安全

1、简介 在现代 IT 基础设施中&#xff0c;管理大量服务器是一项复杂而繁琐的任务。特别是在检查服务器的存活状态以及 SSH 登录等任务上&#xff0c;手动操作非常耗时且容易出错。本文将介绍如何使用 Python 脚本实现对多台服务器的批量检查和管理&#xff0c;包括检查服务器…

用dify实现简单的Agent应用(AI信息检索)

这篇文章里&#xff0c;我们来聊聊如何使用字节最新的豆包大模型&#xff0c;在 Dify 上来快速完成一个具备理解需求、自主规划、自主选择工具使用的简单智能体&#xff08;Agent&#xff09;。 准备工作 完整准备过程分为&#xff1a;准备 Docker 环境、启动 Dify 程序、启动…

Spring框架的学习SpringMVC(1)

1.什么是MVC (1)MVC其实就是软件架构的一种设计模式&#xff0c;它将软件的系统分为&#xff0c;&#xff08;视图&#xff0c;模型&#xff0c;控制器&#xff09;三个部分 1.1View(视图) 视图也就是&#xff0c;在浏览器显示的那一个部分&#xff0c;是后端数据的呈现 1.…