State-Threads初识

news2024/12/24 22:12:04

1.项目简介

协程(coroutine)不是进程或线程,其执行过程更类似于子例程,或者说不带返回值的函数调用。
一个程序可以包含多个协程,可以对比与一个进程包含多个线程。
我们知道多个线程相对独立,有自己的上下文,切换受系统控制。
而协程也相对独立,有自己的上下文,但是其切换由自己控制,当前协程切换到其他协程由当前协程来控制。

协程调度单位减小到函数,上下文切换不需要内核参与,不存在系统调用。
上下文切换开销降到最低,系统调用降到最低,没有锁竞争,没有信号处理。
保留了程序对请求的线性处理逻辑,提高了程序的开发效率,可扩展性和可维护性。协程是一种程序组件。
通常我们把协程理解为是一种程序自己实现调度、用于提高运行效率、降低开发复杂度的东西。
而State-Thread(以下简称st),就是一个由C语言编写的小巧、简洁却高效的开源协程库。
这个库基于单线程运作、不强制占用用户线程,给予了开发者最大程度的轻量级和较低的侵入性。

很多语言都拥有协程,例如python或者golang。
而对于c/c++而言,通常实现协程的常见方式,通常是依赖于glibc提供的setjump&longjump或者基于汇编语言,当然还有基于语义实现(protothread)。
linux上使用协程库的方式,通常也会分为替换函数和更为暴力的替换so来实现。当然而各种方式有各自的优劣。而st选用的汇编语言实现setjump&longjump和要求用户调用st_打头的函数来嵌入程序。
所以st具备了跨平台的能力,以及让开发者们更开心的“与允许调用者自行选择切换时机”的能力。
随着coroutine ts正式进入c++20,c++已经进入协程时代了。但是不幸的是c++20的协程标准只包含编译器需要实现的底层功能,并没有包含简单方便地使用协程的高级库,相关的类和函数进入std标准库估计要等到c++23。
本文先以协程库(State Threads)来讲解c++中的协程。

2.state-threads库下载与编译

https://sourceforge.net/projects/state-threads/
执行命令

make linux-debug

编译生成的可执行文件在/st/st-1.9/obj下
引用State-Threads库需要引用st.h头文件
该文件非源代码,乃编译生成
1723117439733.png

3.c++代码中引用State-Threads

#include <stdio.h>
#include <stdlib.h>
#include "st.h"
 
using namespace std;
 
void* do_calc(void* arg) {
	int sleep_ms = (int)(long int)(char*)arg * 10;
	int i = 0;
	for (;;) {
		i = i+1;
		
		printf("in sthread #%d\n", i);
		st_usleep(sleep_ms * 1000);
	}
 
	return NULL;
}
 
int main(int argc, char** argv) {
	if (argc <= 1) {
		printf("Test the concurrence of state-threads!\n"
			"Usage: %s <sthread_count>\n"
			"eg. %s 10000\n", argv[0], argv[0]);
		return -1;
	}
 
	if (st_init() < 0) {
		printf("error!");
		return -1;
	}
 
	int i;
	int count = atoi(argv[1]);
	for (i = 1; i <= count; i++) {
		if (st_thread_create(do_calc, NULL, 0, 0) == NULL) {
			printf("error!");
			return -1;
		}
	}
 
	st_thread_exit(NULL);
 
	return 0;
}

4.编译

g++ -I ./obj -g ./test.cpp ./obj/libst.a -o test

参考:
https://blog.csdn.net/win_lin/article/details/8242653

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

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

相关文章

Dopple Labs 选择 Zilliz Cloud 作为安全高效的向量数据库

一直以来&#xff0c;我都十分赞同采用通用的标准来评估机器学习领域的技术。向量数据库领域也是如此。Zilliz 发布的性能测试对我有着很大的帮助。 ——Sam Butler Dopple.AI 机器学习总监 01.Dopple AI简介 Dopple Labs Inc. 是 Dopple.AI 的原厂&#xff0c;通过提供创新…

我是如何选择适合我的电脑的

当前有什么可以供自己选择 将从便携、性能、价格、游戏、视频剪辑、高性能、接口、屏幕、使用感受等方面考虑(超出普通人范围电脑不考虑) 非苹果&#xff1a; 轻薄笔记本&#xff1a;最便捷办公笔记本&#xff1a;游戏笔记本台式电脑台式游戏电脑台式高性能电脑 苹果&#…

ROM修改进阶教程------修改rom 内置app的几种方法与注意事项 以及运行库中arm64 .rmeabi-v7a与armeabi 区别

在定制rom的过程中。内置app是很多rom爱好者必须的技能之一。但对于初学者来说。会遇到内置的app无效果或者出现运行有bug的情况。内置app需要根据安卓版本的不同略有变化 .在高安卓版本中还需要内置apk的运行库。 通过今天的博文了解; 1-----内置APP的几种方式步骤 2-----视…

OpenHarmony南向开发 SA服务SELinux权限配置一站式傻瓜式教程

Selinux权限配置 OpenHarmony中SELinux使用详解 目录 SELinux简介SELinux概念SELinux模式OH中SELinux使用详解新增SA服务如何配置SELinux权限SELinux简介 SELinux是Security Enhanced Linux 的缩写,也就是安全强化的 Linux,旨在增强传统Linux操作系统的安全性,解决传统Li…

关于使用webflux开发思考

1、目前终于看到有系统使用spring的webflux进行系统开发&#xff0c;主要原因是比如gpt、千问的大模型数据返回都支持流式方式返回&#xff0c;比如和用户对话&#xff0c;可以流式的把数据给用户展示&#xff0c;不用一次性把数据展示到页面上。 webflux还有一个能力就是&…

MongoDB笔记1——MongoDB简介

MongoDB 什么是MongoDB 2007年10月&#xff0c;MongoDB由10gen团队所开发&#xff0c;2009年2月首度推出。 基于分布式文件存储的数据库由C语言编写。旨在为WEB应用提供可拓展的高性能数据存储解决方案。 MongoDB是一个介于关系数据库和非关系数据库&#xff08;NoSQL&…

东芝新小黑移动硬盘数据被格式化如何恢复(2024年8月版)

在数字化时代&#xff0c;数据已成为我们生活和工作中不可或缺的一部分。东芝新小黑移动硬盘&#xff0c;以其便携性和大容量&#xff0c;成为许多用户存储重要数据的首选。然而&#xff0c;当这些宝贵的数据因意外格式化而面临丢失的风险时&#xff0c;我们该如何应对&#xf…

Visionpro二次开发学习笔记7-使用CogToolDisplay控件

CogToolDisplay控件可显示与视觉工具记录相关的图像&#xff0c;图形和其他状态信息。它使用CogRecord和ICogTool接口将图像和图形连接到CogDisplay。 图片清单 控件的CogComboBox列出当前记录及其子记录中的图像和图形。您可以单击列表并选择要显示的图像或图形。如果记录层…

基于springboot3实现单点登录(二):认证服务端搭建

前言 上文我们介绍了oauth2.0的相关理论和流程&#xff0c;本文我们继续实现。 Oauth2协议中有个很重要的概念&#xff0c;叫做”端点“&#xff0c; 以下整理了一些常用的端点及其参考访问路径及使用场景的信息&#xff0c;供参考。 这些端点在oauth2.0协议的整个生命周期…

白嫖不是梦,三分钟搞定一台服务器

在知乎上浏览时&#xff0c;我偶然发现了一个引人入胜的话题。这个话题附带了一张Excel表格的截图&#xff0c;表格设计得非常巧妙。它允许用户输入包括日薪、工作时间、通勤时间、休息时间以及学历等在内的多个变量。通过这些输入&#xff0c;表格能够计算出一个反映工作性价比…

JAVA—正则表达式

关于正则表达式的了解学习&#xff0c;以及用于校验格式&#xff0c;信息查找和替换分割内容。 目录 1.概述 2.书写规则 3.应用案例 4.用于信息查找 5.用于搜索替换&#xff0c;分割内容 1.概述 由一些特定的字符组成&#xff0c;代表一个规则 作用&#xff1a; 1.校验数据…

国外高清风景视频素材无水印哪里找?

哪里可以下载国外高清风景视频素材&#xff1f;有哪些高清海外素材网站&#xff1f;作为一名从业多年的视频剪辑师&#xff0c;今天就来给大家揭秘可以下载国外高清风景视频素材的网站&#xff0c;赶紧进来看看吧&#xff5e; 1. 稻虎网 稻虎网作为国内外知名视频素材网站&a…

【机器学习】 Sigmoid函数:机器学习中的关键激活函数

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 Sigmoid函数&#xff1a;机器学习中的关键激活函数1. 引言2. Sigmoid函数定义3.…

C++day04

1】思维导图 2】完成关系运算符重载&#xff0c;实现成员函数和全局函数的版本。 #include <iostream>using namespace std;class Stu { friend bool operator<(const Stu &L,const Stu &R); private:int age;int id; public:Stu(){}Stu(int age,int id):age…

OD工具-18个实操工具共创会

一、什么是共创会1.1 什么是共创共创&#xff0c;共同创造词组的缩写&#xff0c;字面上来看就是团队为了多个个体一起把以前没有的事物给产生出或者造出来&#xff0c;这明显的是一种典型的人类自主行为。 托德老师有一段描述:共创是一种工作状态&#xff0c;让团队中的每个个…

【时时三省】(C语言基础)操作符3

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 &取地址操作符 示例: 每个内存单元都有自己的编号 编号就成为内存单元的地址&a就是找出a的地址 后面可以加一个int *pa&#xff1d;&a 是可以用来存放地址 pa是用来存放地址的…

SQL进阶技巧:有序数据合并问题之如何按照指定的规则对数据进行合并?【详解collect_list函数有序性保证】

目录 0 问题描述【小红书面试题】 1 数据准备 2 问题分析 3 小结 0 问题描述【小红书】 有如下需求,需要将左边的表变换成右边的表,注意字段内容的顺序及对应内容的一致性。 第一个字段为name,第二个字段为subject,第三个字段为score,变换后要求subject按照语文、数学…

电脑管家软件搬运导致edge、chrome浏览器不可用

最新版本的腾讯电脑管家可以直接搬运软件到其他路径&#xff0c;但是搬运浏览器会造成软件问题&#xff0c;不建议搬运。 浏览器恢复到原路径&#xff0c;可以解决浏览器不可用的问题&#xff1a; 首先到达你的搬运路径下 可以看到软件文件夹&#xff0c;比如Microsoft Edge或…

C++11——包装器和绑定

1.包装器 C中有一些可调用对象&#xff0c;比如 函数指针&#xff0c;仿函数对象 lambda等等&#xff0c;但是他们又有缺点 因此就引出了包装器的概念 包装器 function的头文件是<functional> 我们可以用包装器包装函数指针&#xff0c;仿函数&#xff0c;lambda int …

关于LLC知识5

RLC的增益曲线不知一条 频率升高&#xff0c;增益会越来越低 无论在容性区还是感性区&#xff0c;当负载加重的时候&#xff0c;R阻值会变小&#xff0c;所以R的分压也会变小&#xff0c;导致增益会变低 当负载突然加重&#xff0c;输出电压会变低&#xff0c;增益曲线由红色变…