数据库修仙秘境篇四——linux锁指北

Kali Linux 修仙全录:从凡人到网络安全金仙的修炼之路 今日我以神通护网络,他朝仗剑守乾坤——此为Kali修仙者的天道誓言。 阅读详情

linux锁指北

锁一般用于解决资源竞争,比如多进程或者多线程场景下。锁主要是为了保证同一个资源在同一时间只能被一名修改者修改。

互斥锁(mutex)

对于竞争资源来说,只要有一方获取了资源的锁,另一方就无法修改竞争资源,需要等待锁释放并获取到锁之后才能进行修改。

有两种方式创建互斥锁:

  • 静态创建

    POSIX定义了一个宏PTHREAD_MUTEX_INITIALIZER 来静态初始化互斥锁,方法如下:

    pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;
    

    在LinuxThreads实现中,pthread_mutex_t是一个结构,而PTHREAD_MUTEX_INITIALIZER则是一个结构常量。
    ————————————————
    版权声明:本文为优快云博主「佰慕哒Chow」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.youkuaiyun.com/qq_18144747/article/details/86671284

  • 动态创建

    动态方式是采用pthread_mutex_init()函数来初始化互斥锁,API定义如下:

    int pthread_mutex_init(pthread_mutex_t  *mutex, const pthread_mutexattr_t*mutexattr)
    

    其中mutexattr用于指定互斥锁属性(见下),如果为NULL则使用缺省属性。 pthread_mutex_destroy ()用于注销一个互斥锁,API定义如下:

    int pthread_mutex_destroy(pthread_mutex_t *mutex)
    

    锁操作主要包括加锁pthread_mutex_lock()、解锁pthread_mutex_unlock()和测试加锁 pthread_mutex_trylock()三个,不论哪种类型的锁,都不可能被两个不同的线程同时得到, 而必须等待解锁。对于普通锁和适应锁类型,解锁者可以是同进程内任何线程; 而检错锁则必须由加锁者解锁才有效,否则返回EPERM;对于嵌套锁,文档和实现要求必须由 加锁者解锁,但实验结果表明并没有这种限制,这个不同目前还没有得到解释。在同一进程中 的线程,如果加锁后没有解锁,则任何其他线程都无法再获得锁。

    ————————————————
    版权声明:本文为优快云博主「佰慕哒Chow」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.youkuaiyun.com/qq_18144747/article/details/86671284

    pthread_mutex_unlock和pthread_mutex_trylock的区别在于前者会阻塞等待直到要获取的锁释放,而后者则不会等待锁释放,若锁被占用则直接返回EBUSY。

互斥锁的优点

优点:由一块能够被多个进程共享的内存空间(一个对齐后的整型变量)组成;这个整型变量的值能够通过汇编语言调用CPU提供的原子操作指令来增加或减少,并且一个进程可以等待直到那个值变成正数。 的操作几乎全部在应用程序空间完成;只有当操作结果不一致从而需要仲裁时,才需要进入操作系统内核空间执行。这种机制允许使用的锁定原语有非常高的执行效率:由于绝大多数的操作并不需要在多个进程之间进行仲裁,所以绝大多数操作都可以在应用程序空间执行,而不需要使用(相对高代价的)内核系统调用。
————————————————
版权声明:本文为优快云博主「佰慕哒Chow」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/qq_18144747/article/details/86671284

读写锁

特点:读写锁适合于对数据结构的读次数比写次数多得多的情况.因为,读模式锁定时可以共享,以写 模式锁住时意味着独占,所以读写锁又叫共享-独占锁.

// 成功则返回0,出错则返回错误编号. 同互斥量以上,在释放读写锁占用的内存之前,需要先通过 pthread_rwlock_destroy对读写锁进行清理工作, 释放由init分配的资源.
int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock, const
    pthread_rwlockattr_t *restrict attr);
int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);
// 成功则返回0,出错则返回错误编号.这3个函数分别实现获取读锁,获取写锁和释放锁的操作
int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);
int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);
int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);
// 非阻塞接口
int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);
int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);

自旋锁(spin_lock)

特点:轮询忙等待。
在单核cpu下不起作用:被自旋锁保护的临界区代码执行时不能进行挂起状态。会造成死锁
自旋锁的初衷就是:在短期间内进行轻量级的锁定。一个被争用的自旋锁使得请求它的线程在等待锁重新可用的期间进行自旋(特别浪费处理器时间),所以自旋锁不应该被持有时间过长。如果需要长时间锁定的话, 最好使用信号量。
————————————————
版权声明:本文为优快云博主「佰慕哒Chow」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/qq_18144747/article/details/86671284

条件变量

与互斥锁不同,条件变量是用来等待而不是用来上锁的。条件变量用来自动阻塞一个线程,直到某特殊情况发生为止。通常条件变量和互斥锁同时使用。条件变量使我们可以睡眠等待某种条件出现。条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待"条件变量的条件成立"而挂起;另一个线程使 “条件成立”(给出条件成立信号)。

条件的检测是在互斥锁的保护下进行的。如果一个条件为假,一个线程自动阻塞,并释放等待状态改变的互斥锁。如果另一个线程改变了条件,它发信号给关联的条件变量,唤醒一个或多 个等待它的线程,重新获得互斥锁,重新评价条件。如果两进程共享可读写的内存,条件变量 可以被用来实现这两进程间的线程同步。
————————————————
版权声明:本文为优快云博主「佰慕哒Chow」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/qq_18144747/article/details/86671284

int pthread_cond_init(pthread_cond_t *cond,pthread_condattr_t *cond_attr);
int pthread_cond_wait(pthread_cond_t *cond,pthread_mutex_t *mutex);
int pthread_cond_timewait(pthread_cond_t *cond,pthread_mutex *mutex,const
      timespec *abstime);
int pthread_cond_destroy(pthread_cond_t *cond);
int pthread_cond_signal(pthread_cond_t *cond);
int pthread_cond_broadcast(pthread_cond_t *cond);  //解除所有线程的阻塞

信号量

信号量、共享内存,以及消息队列等System V IPC三剑客主要关注进程间通信;

而条件变量、互斥锁,主要关注线程间通信。

互斥锁、自旋锁、信号量的区别

信号量、互斥锁和自旋锁的区别

信号量、互斥锁允许进程sleep属于睡眠锁,自旋锁不允许调用者sleep,而是让其循环等待,所以有以下区别应用:

  • 信号量和读写信号量适合于保持时间较长的情况,它们会导致调用者睡眠,因而自旋锁适合于保持时间非常短的情况;
  • 自旋锁可以用于中断,不能用于进程上下文(会引起死锁),而信号量不允许使用在中断中,而可以用于进程上下文;
  • 自旋锁保持期间是抢占失效的,自旋锁被持有时,内核不能被抢占,而信号量和读写信号量保持期间是可以被抢占的。

另外需要注意的是:

信号量锁保护的临界区可包含可能引起阻塞的代码,而自旋锁则绝对要避免用来保护包含这样代码的临界区,因为阻塞意味着要进行进程的切换,如果进程被切换出去后,另一进程企图获取本自旋锁,死锁就会发生;
占用信号量的同时不能占用自旋锁,因为在等待信号量时可能会睡眠,而在持有自旋锁时是不允许睡眠的。

信号量和互斥锁的区别

1、概念上的区别:

信号量:是进程间(线程间)同步用的,一个进程(线程)完成了某一个动作就通过信号量告诉别的进程(线程),别的进程(线程)再进行某些动作。有二值和多值信号量之分;

互斥锁:是线程间互斥用的,一个线程占用了某一个共享资源,那么别的线程就无法访问,直到这个线程离开,其他的线程才开始可以使用这个共享资源。可以把互斥锁看成二值信号量。

2、上锁时:

信号量: 只要信号量的value大于0,其他线程就可以sem_wait成功,成功后信号量的value减一。若value值不大于0,则sem_wait阻塞,直到sem_post释放后value值加一。一句话,信号量的value>=0。

互斥锁: 只要被锁住,其他任何线程都不可以访问被保护的资源。如果没有锁,获得资源成功,否则进行阻塞等待资源可用。一句话,线程互斥锁的vlaue可以为负数。

3、使用场所:

信号量主要适用于进程间通信,当然,也可用于线程间通信。而互斥锁只能用于线程间通信。
————————————————
版权声明:本文为优快云博主「佰慕哒Chow」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/qq_18144747/article/details/86671284

reference

  1. https://blog.youkuaiyun.com/qq_18144747/article/details/86671284
《缠中说禅108课》5:市场无须分析,只要看和干 喜欢吹牛皮的,在市场里最常见,例如一种以分析市场、吹牛皮为生的职业,叫什么股评、专家的。此类人不过是市场上的寄生虫,真正的猎手只会观察、操作,用嘴是打不了豺狼的。 市场就是一个狩猎场,首先你要成为一个好猎手,而一个猎手,首先要习惯于无言。如果真有什么真理,那真理也是无言的。可言说的,都不过是人类思想的分泌物,臭气熏天。真不可言说了,就无不可言,言而无言,是乃真言。 一个好的猎手,可以没有嘴巴,但一定会有一双不为外物所动的眼睛,在这眼睛下,一切如幻化般透明。要不被外物所动,则首先要不被自我所迷惑,其实.. 阅读详情

相关推荐

Cursor 团队代码规范与开发规则

本文提出了一套 Cursor 项目开发规范,涵盖代码结构、命名、日志、测试等关键环节,旨在提升代码质量和团队协作效率。核心规则包括:文件不超过2000行、函数不超过80行;变量命名禁用无意义单词;日志只记录关键信息;配置项禁止硬编码;依赖和敏感信息统一管理;核心逻辑测试覆盖率≥80%;Git提交遵循Conventional Commits规范。通过一个车辆数据处理函数的改造案例,展示了从"不规范"到"规范"的代码优化过程,体现了拆分函数、常量管理、错误处理等规范的实际

1256

读写锁

读写锁规则:1.只要没有线程在修改某个给定的数据,那任意数目的线程都可以拥有该数据的读访问权限。2.仅当没有其他线程在读或修改某个给定的数据时,当前线程才可以修改它。读写锁优点:1.某些应用中读数据比写数据频繁,则可以改用读写锁替代互斥锁。2.任意给定时刻允许多个读出者存在提供了更高的并发度。共享-独占上锁:对于某个给定资源的共享访问。共享锁:获取一个读写锁用于读。独占锁:获取一个读写锁用于写。p...

Hulk 378

Isaac Sim 车辆动力学:从参数调优到户外仿真的挑战与实战

本文深入探讨了Isaac Sim在车辆动力学仿真中的应用,从参数调优到户外场景模拟的实战经验。详细解析了悬架系统、轮胎物理模型等核心参数的设置技巧,并分享了应对户外仿真挑战的实用方案。通过Vehicle Wizard高级使用和传感器配置,帮助开发者高效完成车辆仿真与算法开发。

weixin_29192211的博客 404

多线程互斥锁 pthread_mutex 的使用及初始化问题

互斥锁 pthread_mutex 的使用及注意事项

咸鱼弟的博客 2万+

双重机器学习 stata教程 手把手教学

双重机器学习(DDML)的stata教程

weixin_59030591的博客 1万+

Vivado加上VsCode让你的生活更美好

VsCode与Vivado的灵活使用 引言 ​ 现在大二了,在接触硬件描述语言。Vivado自带的编辑器实在很难用,为了能够“极客”一些,当然是去Google了一下有哪些方法可以取而代之。 ​ 网络上的答案大同小异,基本上都是用的Sublime Text.(我的学长们也几乎都是) 平时码代码的过程中,我习惯与使用VsCode,尤其是在微软收购GitHub之后,Code 简直就是神器了。于是乎…一个...

qq_39498701的博客 10万+

互斥锁

liqihacker的专栏 902

Ubuntu开机卡在BusyBox?3种方法快速修复initramfs错误(附详细命令)

本文详细介绍了Ubuntu开机卡在BusyBox并出现initramfs错误的3种修复方法,包括使用fsck检查文件系统、调整BIOS/UEFI存储设置以及修改GRUB内核参数。针对常见的文件系统错误和根设备无法找到问题,提供了具体的命令行操作步骤和实用技巧,帮助用户快速恢复系统启动。

milk8的博客 785

线程锁的基本概念与简单封装

线程锁的基本概念与简单封装 1.在多线程环境中,当我们需要保持线程同步时,通常通过锁来实现。 互斥锁的使用过程中,主要有 第一:线程锁的初始化,pthread_mutex_init 第二:线程锁的释放,pthread_mutex_destory 第三:线程锁的加锁操作,pthread_mutex_lock 第四:线程锁的解锁操作,pthread_mutex_unlock

一个人的旅行的博客 8867

机器学习-深嵌交叉验证(Nested Cross-Validation)

Section I: Code and Analyses 第一部分:代码 from sklearn import datasets from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.svm import SVC from...

Santorinisu Blogs 2717

喷涂机器人系列编程:ABB IRB 5500_(9).常见故障诊断与排除

ABB IRB 5500 喷涂机器人在实际应用中可能会遇到各种故障,但通过系统的诊断和排除方法,可以确保生产线的连续运行。定期维护和保养是预防故障的重要手段,而操作培训和规范则能有效减少人为因素引起的故障。希望本节内容能帮助操作和维护人员提高故障诊断和排除的效率,确保喷涂机器人的稳定运行。如果您有任何疑问或需要进一步的帮助,请联系 ABB 客户服务中心。

zhubeibei168的博客 1045

【Linux】线程安全及锁的使用

【Linux】线程安全及锁的使用

m0_62714628的博客 1234

保姆级教程:ABAP 通过 HTTP POST 调用 OData 服务创建业务数据的具体例子

笔者之前的文章发布之后,有朋友在评论区留言,询问 ABAP 除了 Web Service 之外,是否也支持 HTTP 呢?ABAP 这么强大的语言,支持 HTTP 当然不在话下。网上有很多在 ABAP 系统基于 CL_HTTP_CLIENT 工具类,通过 HTTP 协议和第三方系统交互的代码例子。本文介绍笔者项目中一个实际例子,实现的是在 ABAP 系统 A 通过 HTTP 调用 OData 服务,在 ABAP 系统 B 创建业务数据的需求。下面我们按照这个套路来一步步实现。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 701

数据库修仙秘境篇六——linux socket编程指北

linux socket编程指北 以下server和client的c代码均拷贝自博客,详细内容请阅读原文。在其上添加了错误码打印,修改了服务端ip和端口,并增加了makefile脚本。 server /*serve_tcp.c*/ #include<stdio.h> #include<sys/socket.h> #include<netinet/in.h> #include<stdlib.h> #include<arpa/inet.h> #incl

growdu的网络博客 1289

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

数据库修仙秘境篇五——linux cache指北

linux cache指北 cache是什么 计算机中数据存取满足“二八定律”(局部性原理),为了以较低的成本大幅提高性能,现代cpu都有cache。cpu cache已经发展到了三级缓存结构,基本上现在买的个人电脑都是L3结构。其中L1和L2cache为每个核独有,L3则所有核共享。 本文内容大量摘抄自飘舞的雪的博客,详情请参阅原文。 cache bouncing 为了保证所有的核看到正确的内存数据,一个核在写入自己的L1 cache后,CPU会执行Cache一致性算法把对应的cacheline(一般是

growdu的网络博客 574

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

数据库修仙秘境篇七——linux内核模块指北

linux内核模块指北 linux内核提供在运行时可进行扩展的特性,这意味着当系统启动并运行时,我们可以向内核添加或移除部分功能。我们在运行时添加到内核中的代码就被成为动态可加载内核模块,我们简称为内核模块。可以将内核模块模块简单理解为linux内核的插件。 内核模块基本操作 内核模块编译后会生成.ko的文件,在linux系统中可以执行如下命令查看模块相关信息。 #加载内核模块 insmod #卸载内核模块 rmmod #列出内核模块 lsmod #查看模块信息 modinfo modname 编写内核模

growdu的网络博客 535

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

数据库修仙秘境篇三——linux内存管理指北

linux内存管理指北 内存是一段连续的地址单元,linux内核接管内存管理后,会将内存划分为内核区和用户区。因而内存管理就分为两个层面: 内核内存管理 一般是kmalloc(小块内存)和vmalloc(大块内存)。 用户内存管理 一般是malloc(小块内存)和mmap(大块内存)。 本文内容大量摘抄引用自Mortree的博客和CodingLabs博客,这里只是做了简单的整理。详细内容请阅读他们的博客。 内存分类 相对于进程来说,内存分为如下几个部分: 堆 栈 数据段 代码段 bss段 当

growdu的网络博客 214

数据库修仙秘境篇五——linux巨页内存编程

linux大页内存 HugePages是通过使用大页内存来取代传统的4kb内存页面,使得管理虚拟地址数变少,加快了从虚拟地址到物理地址的映射以及通过摒弃内存页面的换入换出以提高内存的整体性能。 概念 Page Table: page table也就是一种用于内存管理的实现方式,用于物理地址到虚拟之间的映射。因此对于内存的访问,先是访问Page Table,然后根据Page Table 中的映射关系,隐式的转移到物理地址来存取数据。 TLB: Translation Lookaside Buffer (TL

growdu的网络博客 1958

数据库修仙金丹篇九——vlan使用指北

vlan使用指北 vlan详细内容请参考博客。 VLAN(Virtual Local Area Network)的中文名为"虚拟局域网"。 LAN可以是由少数几台家用计算机构成的网络,也可以是数以百计的计算机构成的企业网络。VLAN所指的LAN特指使用路由器分割的网络——也就是广播域。 简单来说,同一个VLAN中的用户间通信就和在一个局域网内一样,同一个VLAN中的广播只有VLAN中的 成员才能听到,而不会传输到其他的VLAN中去,从而控制不必要的广播风暴的产生。同时, 若没有路由,不同VLAN之间不

growdu的网络博客 816

数据库修仙秘境篇一——不得不知道的linux库的装载、链接

不得不知道的linux库的装载、链接

growdu的网络博客 421

数据库修仙秘境篇二——做磁盘管理之前你一定要了解的lvm知识

lvm详解

growdu的网络博客 1449

数据库修仙金丹篇八——dpdk之kni使用

dpdk之kni使用 什么是kni Kni(Kernel NIC Interface)内核网卡接口,是DPDK允许用户态和内核态交换报文的解决方案,模拟了一个虚拟的网口,提供dpdk的应用程序和linux内核之间通讯。kni接口允许报文从用户态接收后转发到linu协议栈去。 为什么要弄一个kni接口,虽然dpdk的高速转发性能很出色,但是也有自己的一些缺点,比如没有协议栈就是其中一项缺陷,当然也可能当时设计时就将没有将协议栈考虑进去,毕竟协议栈需要将报文转发处理,可能会使处理报文的能力大大降低。 当k

growdu的网络博客 7739

Linux的修仙之路——安装和基本命令

Linux的安装和基本命令Linux的安装Linux由来Linux的组成部分Linux现行发行版本VMware安装LinuxLinux的基本命令浏览目录、文件类命令系统信息类命令进程管理类命令软件包管理命令其他常用命令Linux的配套练习 Linux的安装 Linux由来 初显身手的Linux Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和Unix的多用户、多任务、支持多线程和多CPU的操作系统。伴随着互联网的发展,Linux得到了来自全世界软件爱好者、组织、公司的支持。它除

ningsheng的博客 2988

数据库修仙金丹篇十二——ptp1588v2实现方案

ptp1588v2实现方案

growdu的网络博客 1977

大数据生态系统 修仙之道 Linux Blog

大数据生态系统 修仙之道 Linux Blog @(2019-01-03)[Docs Language:简体中文 &amp; English|Programing Language:Linux|Website:www.geekparkhub.com||GeekDeveloper:JEEP-711|Github:github.com/geekparkhub|Gitee:gitee.com/geekp...

JEEP/711 Blog 612

跨界内容生成系统:从拓扑算法到修仙规则引擎的技术实现

规则引擎作为现代软件系统的核心组件,通过定义和执行业务逻辑来实现复杂的决策流程。其技术原理基于条件判断和动作执行的组合,能够将抽象的业务需求转化为可执行的代码逻辑。在技术价值层面,规则引擎提供了高度的灵活性和可维护性,使系统能够快速适应需求变化。特别是在游戏开发和内容生成领域,规则引擎的应用尤为广泛,能够处理复杂的角色属性计算、环境交互逻辑和随机事件生成。以拓扑算法为例,这种数学概念可以转化为游戏中的关卡生成机制,通过连通性分析和空间变换创造多样化的游戏体验。结合修仙题材的设定系统,规则引擎能够实现境界提升

weixin_34087307的博客 348
上一篇: 数据库修仙金丹篇八——dpdk之kni使用
下一篇: 数据库修仙秘境篇三——linux内存管理指北
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我在数据库世界里修仙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值