Linux 旗标实现「建议收藏」

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


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)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • batch内负采样

    batch内负采样一般在计算softmax交叉熵时,需要用tf.nn.log_uniform_candidate_sampler多itemid做随机负采样。但是在类似dssm这种双塔模型中,item侧特征除了itemid外,还有其他meta特征,此时负样本对itemid做负采样后,还需要取相应负样本的meta特征。可是在tf训练数据中并不方便建立itemid与各类meta特征的映射表。为了解决dssm类模型的负采样问题,可以取一个batch内其他用户的正样本做为本用户的负样本,以解决负采样meta特征问题。好了,废话少说,

    2022年6月23日
  • 使用aspose把各种文件转换成pdf

    使用aspose把各种文件转换成pdfpackagecom.fh.util;importjava.io.File;importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.InputStream;importorg.apache.pdfbox.pdmodel.PD…

    2022年6月4日
  • 贪吃蛇编程代码python_Python贪吃蛇游戏编写代码「建议收藏」

    贪吃蛇编程代码python_Python贪吃蛇游戏编写代码「建议收藏」最近在学Python,想做点什么来练练手,命令行的贪吃蛇一般是C的练手项目,但是一时之间找不到别的,就先做个贪吃蛇来练练简单的语法。由于Python监听键盘很麻烦,没有C语言的kbhit(),所以这条贪吃蛇不会自己动,运行效果如下:要求:用#表示边框,用*表示食物,o表示蛇的身体,O表示蛇头,使用wsad来移动Python版本:3.6.1系统环境:Win10类:board:棋盘…

    2022年6月28日
  • Android退出APP时如何同时结束APP进程

    Android退出APP时如何同时结束APP进程1.在退出APP的代码逻辑里加入以下代码:ActivityManageram=(ActivityManager)getSystemService(ACTIVITY_SERVICE);am.killBackgroundProcesses(“包名”);//API至少为8才能使用2.添加权限

    2022年7月17日
  • Python初识模块之正则表达式

    Python初识模块之正则表达式什么是正则表达式  正则表达式是字符串匹配的一种规则,在线测试工具http://tool.chinaz.com/regex/[字符组]在同一个位置可能出现的各种字符组成了一个字符组,在正则表达式中用[]表示字符分为很多类,比如数字、字母、标点等等。假如你现在要求一个位置”只能出现一个数字”,那么这个位置上的字符只能是0、1、2…9这10个数之一。[0-9]、[a-z]、[A…

    2022年7月13日
  • spawn ssh「建议收藏」

    spawn ssh「建议收藏」#!/usr/bin/expectsetip[lindex$argv0];setusername[lindex$argv1];setpassword[lindex$argv2];setkey_init”*yes/no*”setkey_password”[Pp]assword:”settimeout30setprompt”(#|%|\\$)

    2022年11月1日

发表回复

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

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