SylixOS vutex

news2025/1/10 20:34:00

vutex 概念

SylixOS 引入了与 Linux futex 类似的用户快速锁 vutex(vitual user mutex)(SylixOS 习惯称为“等待变量锁”);vutex 包括两个操作:pend 和 post,pend 操作用于等待期望值得到满足,post 操作用于设置期望值,并唤醒等待的线程。

vutex 通过一个变量地址(整形变量)管理线程间的“锁”,该变量地址为用户空间地址,因此在同一个进程中,vutex 的 pend 与 post 操作使用同一个虚拟地址(内核通过该虚拟地址对应的物理地址进行期望值的管理);在两个不同的进程之间,则需要建立一个共享内存,实现使用同一个物理地址的目的。

在这里插入图片描述
图 7.20 vutex 基本原理

vutex pend 操作

vutex pend 用于线程/进程等待一个期望的值,pend 操作可以设置线程/进程的等待方式(等待指定的时间、永久等待、不等待),如果等待方式设置为等待指定的时间(单位为 TICK),当时间超时后,期望的值仍然未满足,则 pend 函数返回错误并设置错误号(ERROR_THREAD_WAIT_TIMEOUT);如果等待方式为永久等待,则等待线程的期望值未满足之前将永远陷入等待,直到期望值满足或线程被删除;特殊地,如果等待方式设置为不等待,则 pend 函数仅尝试一次查询期望值,如果期望值不满足,pend 函数返回错误并设置错误号(ERROR_THREAD_WAIT_TIMEOUT)。

vutex pend 接口详细描述如下:

#include <SylixOS.h>
INT  Lw_Vutex_Pend(INT  *piVar, INT  iDesired, ULONG  ulTimeout)
INT  Lw_Vutex_PendEx(INT  *piVar, INT  iCompare, INT  iDesired, ULONG  ulTimeout)

函数原型分析:

  • 函数成功返回 0,失败返回-1 并设置错误号。
  • 参数 piVar 是变量地址。
  • 参数 iCompare 是比较方法,如表 7.12 所示。
  • 参数 iDesired 是期待的值。
  • 参数 ulTimeout 是等待的超时时间(单位为 TICK)。

参数 iCompare 指定了设置值与期望值得比较策略,这些比较策略拓宽了 pend 函数的使用场景,例如 GREATER_EQU 策略,允许在设置值大于期望值得时候满足条件,而不仅仅是必须等于期望值。

表 7.12 vutex 比较方法

vutex 比较方法说明
LW_OPTION_VUTEX_EQU设置值与期望值相同
LW_OPTION_VUTEX_NOT_EQU设置值与期望值不相同
LW_OPTION_VUTEX_LESS设置值小于期望值
LW_OPTION_VUTEX_LESS_EQU设置值小于等于期望值
LW_OPTION_VUTEX_GREATER设置值大于期望值
LW_OPTION_VUTEX_GREATER_EQU设置值大于等于期望值
LW_OPTION_VUTEX_AND设置值完全包含期望值
LW_OPTION_VUTEX_NOT设置值不包含期望值
LW_OPTION_VUTEX_OR设置值部分包含期望值

vutex post 操作

vutex post 是 vutex pend 的反操作,post 将满足期望的值设置到变量地址(参数 piVar 指定的地址),post 设置完期望值后会唤醒被阻塞的线程,根据不同的使用场景,post 包括以下三种设置方式:

  • 全部唤醒并阻塞的线程。
  • 仅唤醒被阻塞的线程不设置期望值。
  • 深度唤醒(设置期望值并唤醒单个线程)。
#include <SylixOS.h>
INT  Lw_Vutex_Post(INT  *piVar, INT  iValue)
INT  Lw_Vutex_PostEx(INT  *piVar, INT  iValue, INT  iFlags)

函数原型分析:

  • 函数成功返回 0,失败返回-1 并设置错误号。
  • 参数 piVar 是变量地址。
  • 参数 iValue 是要设置的值。
  • 参数 iFlags 是 vutex 标志,如表 7.13 所示。

表 7.13 vutex 锁标志

vutex 标志说明
LW_OPTION_VUTEX_FLAG_WAKEALL全部唤醒
LW_OPTION_VUTEX_FLAG_DONTSET不设置变量值
LW_OPTION_VUTEX_FLAG_DEEPWAKEPost 不进行相同值检查优化

下面程序展示了 vutex 在两个线程间实现的同步作用。

#include <SylixOS.h>
#include <pthread.h>

static  int  *pvar = NULL;

static void *t_vpend (void *arg)
{
    int  ret;

    printf("vutex start pend, expect value == 1\n");
    ret = API_VutexPend(pvar, 1, LW_OPTION_WAIT_INFINITE);
    printf("vutex pend return: %d\n", ret);
    return (NULL);
}

static void *t_vpost (void *arg)
{
    sleep(1);
    printf("vutex post expect 1\n");
    API_VutexPost(pvar, 1);
    return  (NULL);
}

int main (int argc, char **argv)
{
    pthread_t   tid0, tid1;

    pthread_create(&tid0, NULL, t_vpend, NULL);
    pthread_create(&tid1, NULL, t_vpost, NULL);
    pthread_join(tid0, NULL);
    pthread_join(tid1, NULL);
    return  (0);
}

在 SylixOS Shell 下运行程序:

# ./vutex_use
vutex start pend, expect value == 1
vutex post expect 1
vutex pend return: 0

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

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

相关文章

DFS专题

题单地址&#xff1a;【237题】算法基础精选题单_ACM竞赛_ACM/CSP/ICPC/CCPC/比赛经验/题解/资讯_牛客竞赛OJ_牛客网 老子的全排列呢 dfs回溯 int n 8; int idx; int record[10]; bool vis[10];void dfs(int num) {if(numn){for(int i1;i<n;i) cout<<record[i]<…

【ONE·C++ || C++11(一)】

总言 主要介绍C11中的一些功能语法。 文章目录 总言0、思维导图1、基本情况简介2、统一的列表初始化2.1、{}的使用2.2、initializer_list2.2.1、基础介绍2.2.2、在各容器中实现说明 3、声明3.1、auto3.2、nullptr3.3、decltype 4、范围for5、智能指针6、STL中一些变化6.1、C11…

一、版本控制

1、什么是版本控制 1.1、版本控制的概念 版本控制&#xff08;Revision control&#xff09;是一种在开发的过程中用于管理我们对文件、目录或工程等内容的修改历史&#xff0c;方便查看更改历史记录&#xff0c;备份以便恢复以前的版本的软件工程技术。 1.2、版本控制的作用…

泛型方法、Function类的函数化编程与调用

0、引言 在项目开发的过程中&#xff0c;常常需要将一些高频复用的方法封装成工具类&#xff0c;例如最近学到的Redis缓存中&#xff0c;解决缓存穿透、解决缓存击穿的方法&#xff08;例如解决缓存穿透的问题的方法queryWithPassThrough&#xff09;&#xff0c;传入一个Long型…

谷粒商城:Oss endpoint can‘t be empty.问题

商品API &#xff0c;文件上传管理的时候 出现这个问题 解决两个方向 1.springBoot、alibabaCloud、springCloud、aliyunOSS 之间的版本问题&#xff0c;我的是下面的版本可以运行了。 // springBoot版本 2.7.7 <groupId>org.springframework.boot</groupId> &l…

中关村论坛 | 金融业从增量到存量博弈背后两大原因 更重要的是……

在数字经济浪潮下&#xff0c;中国金融业正在经历数字化转型的深刻变革。为研判金融科技行业发展趋势和前景&#xff0c;探索金融创新与监管安全的边界&#xff0c;“2023中关村论坛金融科技论坛”于5月29日召开。 中电金信常务副总经理冯明刚与中国银行软件中心副总经理康钧伟…

链表:虚拟头节点你会用吗?

大家好&#xff0c;我是三叔&#xff0c;很高兴这期又和大家见面了&#xff0c;一个奋斗在互联网的打工人。 前言&#xff1a;什么是链表 什么是链表&#xff0c;链表是一种通过指针串联在一起的线性结构&#xff0c;每一个节点由两部分组成&#xff0c;一个是数据域一个是指…

提高用户忠诚度的 4 种客户保留策略

什么是客户保留&#xff1f;简而言之&#xff0c;客户保留是指企业用来鼓励现有客户群重复购买和持续忠诚度的策略和战术。根据最近的研究&#xff0c;多达68%的客户在觉得公司不重视他们的业务时会转向竞争对手。 这就是为什么客户保留对各行各业的企业都如此重要的原因。与获…

《程序员面试金典(第6版)》面试题 16.25. LRU 缓存(自定义双向链表,list库函数,哈希映射)

题目描述 设计和构建一个“最近最少使用”缓存&#xff0c;该缓存会删除最近最少使用的项目。缓存应该从键映射到值(允许你插入和检索特定键对应的值)&#xff0c;并在初始化时指定最大容量。当缓存被填满时&#xff0c;它应该删除最近最少使用的项目。 题目传送门&#xff1a;…

消息队列内容

问题有哪些&#xff1f; &#xff08;1&#xff09;消息队列为什么会出现&#xff1f; &#xff08;2&#xff09;消息队列能用来干什么&#xff1f; &#xff08;3&#xff09;使用消息队列存在的问题&#xff1f; &#xff08;4&#xff09;如何解决重复消费的问题&#…

PyCharm安装使用教程

简介 PyCharm是一种PythonIDE&#xff08;Integrated Development Environment&#xff0c;集成开发环境&#xff09;&#xff0c;带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具&#xff0c;比如调试、语法高亮、项目管理、代码跳转、智能提示、自动完成、单…

docker-安装redis集群

目录 1.服务器列表 2.安装docker 3.docker内网IP地址配置 4.docker安装redis集群 1.选择合适数据位置 2.循环生成redis配置目录 3.打开宿主机防火墙端口 4.循环生成redis容器 5.创建集群命令 6.命令行集群验证 1.服务器列表 服务器列表 nameip远程端口用户名/密码cen…

One2Multi Graph Autoencoder for Multi-view Graph Clustering

One2Multi Graph Autoencoder for Multi-view Graph Clustering | Proceedings of The Web Conference 2020 (acm.org) 目录 Abstract 1 Introduction 2 Model 2.1 Overview 2.2 One2Multi Graph Convolutional Autoencoder Informative graph convolutional encoder M…

Eclipse教程 Ⅸ

今天继续来学习Eclipse 快速修复、Eclipse 浏览菜单、Eclipse 查找以及Eclipse 悬浮提示的内容&#xff01;老规矩&#xff0c;废话不多说&#xff0c;开始吧。 Eclipse 快速修复 使用快速修复 在 Eclipse 编辑器中当你输入字母时&#xff0c;编辑器会对你输入的内容进行错误…

PostgreSQL FDW

一、FDW简单理解 FDW (foreign-data wrapper&#xff0c;外部数据包装器)&#xff0c;PostgreSQL FDW 是一种外部访问接口&#xff0c;它可以被用来访问存储在外部的数据&#xff0c;这些数据可以是外部的pg数据库&#xff0c;也可以oracle、mysql等数据库&#xff0c;甚至可以…

大气气溶胶期末复习笔记

大气气溶胶期末复习笔记 大气气溶胶 广义&#xff1a;指悬浮在大气中的各种固态和液态微粒与大气构成的混合体系 狭义&#xff1a;指大气中悬浮的各种固态粒子&#xff0c;简称气溶胶粒子 来源 直接注入 通过地表直接注入大气固体&#xff0c;液体物质的破碎过程中产生&…

筛质数—(埃氏筛欧拉筛)

埃氏筛&欧拉筛 埃氏筛欧拉筛 例题&#xff1a;AcWing 868. 筛质数 对欧拉筛的理解不是很深刻&#xff0c;写下自己的理解&#xff0c;加深一下理解&#xff0c;也方便后期忘记后再学习 埃氏筛 埃氏筛的主要思想是让质数x去筛掉x的所有合数&#xff0c;这个比较容易理解。…

机器学习知识经验分享之五:R语言安装

python语言用于深度学习较为广泛&#xff0c;R语言用于机器学习领域中的数据预测和数据处理算法较多&#xff0c;后续将更多分享机器学习数据预测相关知识的分享&#xff0c;有需要的朋友可持续关注&#xff0c;有疑问可以关注后私信留言。 目录 一、R语言介绍 二、R语言安装…

装饰器模式:实现类功能的动态扩展

一&#xff0c;简介 装饰器模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许在不修改原有类结构的情况下&#xff0c;给一个对象动态添加额外的职责。通常情况下&#xff0c;扩展一个类的功能我们首先会想到用继承方式来实现&#xff0c…

7步搞懂手写数字识别Mnist

大家好啊&#xff0c;我是董董灿。 图像识别有很多入门项目&#xff0c;其中Mnist 手写数字识别绝对是最受欢迎的。 该项目以数据集小、神经网络简单、任务简单为优势&#xff0c;并且集合了CNN网络中该有的东西&#xff0c;可谓麻雀虽小&#xff0c;五脏俱全。 非常适合新手…