Linux 旗标实现「建议收藏」

Linux 旗标实现「建议收藏」Linux内核提供了一个遵守上面语义的旗标实现,尽管术语有些不同.为使用旗标,内核代码必须包含<asm/semaphore.h>.相关的类型是structsemaphor

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

Linux 内核提供了一个遵守上面语义的旗标实现, 尽管术语有些不同. 为使用旗标, 内核 代码必须包含 <asm/semaphore.h>. 相关的类型是 struct semaphore; 实际旗标可以用 几种方法来声明和初始化. 一种是直接创建一个旗标, 接着使用 sema_init 来设定它:

 

void sema_init(struct semaphore *sem, int val); 这里 val 是安排给旗标的初始值.

然而, 通常旗标以互斥锁的模式使用. 为使这个通用的例子更容易些, 内核提供了一套帮 助函数和宏定义. 因此, 一个互斥锁可以声明和初始化, 使用下面的一种:

 

DECLARE_MUTEX(name); DECLARE_MUTEX_LOCKED(name);

 

这里, 结果是一个旗标变量( 称为 name ), 初始化为 1 ( 使用 DECLARE_MUTEX ) 或者 0 (使用 DECLARE_MUTEX_LOCKED ). 在后一种情况, 互斥锁开始于上锁的状态; 在允许任 何线程存取之前将不得不显式解锁它.

 

如果互斥锁必须在运行时间初始化( 这是如果动态分配它的情况, 举例来说), 使用下列 中的一个:

 

void init_MUTEX(struct semaphore *sem);

void init_MUTEX_LOCKED(struct semaphore *sem);

 

在 Linux 世界中, P 函数称为 down — 或者这个名子的某个变体. 这里, “down” 指的 是这样的事实, 这个函数递减旗标的值, 并且, 也许在使调用者睡眠一会儿来等待旗标变 可用之后, 给予对被保护资源的存取. 有 3 个版本的 down:

 

void down(struct semaphore *sem);

int down_interruptible(struct semaphore *sem); int down_trylock(struct semaphore *sem);

 

down 递减旗标值并且等待需要的时间. down_interruptible 同样, 但是操作是可中断的. 这个可中断的版本几乎一直是你要的那个; 它允许一个在等待一个旗标的用户空间进程被 用户中断. 作为一个通用的规则, 你不想使用不可中断的操作, 除非实在是没有选择. 不 可中断操作是一个创建不可杀死的进程( 在 ps 中见到的可怕的 “D 状态” )和惹恼你的 用户的好方法, 使用 down_interruptible 需要一些格外的小心, 但是, 如果操作是可中 断的, 函数返回一个非零值, 并且调用者不持有旗标. 正确的使用 down_interruptible 需要一直检查返回值并且针对性地响应.

 

最后的版本 ( down_trylock ) 从不睡眠; 如果旗标在调用时不可用, down_trylock 立 刻返回一个非零值.

 

一旦一个线程已经成功调用 down 各个版本中的一个, 就说它持有着旗标(或者已经”取得 “或者”获得”旗标). 这个线程现在有权力存取这个旗标保护的临界区. 当这个需要互斥的 操作完成时, 旗标必须被返回. V 的 Linux 对应物是 up:

 

void up(struct semaphore *sem);

 

一旦 up 被调用, 调用者就不再拥有旗标.

 

如你所愿, 要求获取一个旗标的任何线程, 使用一个(且只能一个)对 up 的调用释放它. 在错误路径中常常需要特别的小心; 如果在持有一个旗标时遇到一个错误, 旗标必须在返 回错误状态给调用者之前释放旗标. 没有释放旗标是容易犯的一个错误; 这个结果( 进程 挂在看来无关的地方 )可能是难于重现和跟踪的.

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/167967.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 因特网是一种什么网_广域网是因特网吗

    因特网是一种什么网_广域网是因特网吗以太网详解(一)

    2022年10月18日
    2
  • linux下设置定时执行脚本「建议收藏」

    linux下设置定时执行脚本「建议收藏」linux下设置定时执行脚本1.首先安装所需程序并启动crontabs是设置周期性被执行的指令yuminstallvixie-cronyuminstallcrontabsservicecrondstartservicecrondstatus出现以下信息则表示crond启动成功●crond.service-CommandSchedulerLoaded…

    2022年7月17日
    14
  • 【Swift】学习笔记(四)——设置(Collection)

    【Swift】学习笔记(四)——设置(Collection)

    2022年1月4日
    44
  • 预测算法用java实现吗_java 数据结构与算法

    预测算法用java实现吗_java 数据结构与算法常见的预测算法有1.简易平均法,包括几何平均法、算术平均法及加权平均法;2.移动平均法,包括简单移动平均法和加权移动平均法;3,指数平滑法,包括一次指数平滑法和二次指数平滑法,三次指数平滑法;4,线性回归法,包括一元线性回归和二元线性回归,下面我一一的简单介绍一下各种方法。 4P5?.C(B4j”^5_2h  一,简易平均法,是一种简便的时间序列法。是以一定观察期的数据求得

    2025年6月18日
    2
  • ViewStub详解

    ViewStub详解首先上源码:packageandroid.view;importandroid.annotation.IdRes;importandroid.annotation.LayoutRes;importandroid.content.Context;importandroid.content.res.TypedArray;importandroid.graphics.Canvas;importandroid.util.AttributeSet;importandroid.widg

    2022年6月28日
    25
  • 国内不用备案的cdn_2018年广电总局电影备案查询

    国内不用备案的cdn_2018年广电总局电影备案查询随着行业老大哥百度云加速的CDN关闭,不,不能说是关闭,是不再面向国外用户(实则是不再面向未备案中国用户),喜欢简单而快捷方式的草根大佬们不知道该何去何从,特别是用习惯了CDN的大佬,更是讨厌裸奔的感觉,没了层CDN,还真就觉得不安全了!事实上,CDN确实让我们的网站加速了不少,当然,排除那些劣质的CDN,有人可能会感觉不用CDN自己的网站反而会快很多,这个是错误的认知,你的网站访问不大的…

    2025年10月21日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号