当前位置: 首页 > wzjs >正文

网站促销活动策划武汉seo人才

网站促销活动策划,武汉seo人才,广州十大跨境电商公司排名,泉山微网站开发📝前言: 这篇文章我们来讲讲Linux——自旋锁和读写锁 🎬个人简介:努力学习ing 📋个人专栏:Linux 🎀CSDN主页 愚润求学 🌄其他专栏:C学习笔记,C语言入门基础&…

📝前言:

这篇文章我们来讲讲Linux——自旋锁和读写锁

🎬个人简介:努力学习ing
📋个人专栏:Linux
🎀CSDN主页 愚润求学
🌄其他专栏:C++学习笔记,C语言入门基础,python入门基础,C++刷题专栏


这里写目录标题

  • 一、自旋锁
    • 1. 基本介绍
    • 2. 原理
    • 3. 接口
  • 二、读写锁
    • 1. 基本介绍
    • 2. 实现
    • 3. 接口

一、自旋锁

1. 基本介绍

  • 自旋锁是一种多线程同步机制,用于保护共享资源免受并发访问的影响。
  • 在多个线程尝试获取锁时,它们会持续自旋(即在一个循环中不断检查锁是否可用)而不是立即进入休眠状态等待锁的释放。【这是自旋锁和互斥锁的重要区别】
  • 这种机制减少了线程切换的开销,适用于短时间内锁的竞争情况
    • 当获取锁的线程访问临界区的时间很短的时候,就不需要把申请不到锁的线程阻塞挂起,因为这样的线程切换开销大(比一直等的开销大)
    • 而是可以,让线程自旋,一直尝试申请锁

在这里插入图片描述

2. 原理

自旋锁通常使用一个共享的标志位bool来表示锁的状态。

  • 当标志位为true 时,表示锁已被某个线程占用;(当一个线程尝试获取自旋锁时,但是标记位为true,它会不断检查标志位)
  • 当标志位为 false 时,表示锁可用。它会获得这个锁,并把锁的标记位设置为true

3. 接口

pthread库也提供了自旋锁的接口
类型

pthread_spinlock_t

初始化

int pthread_spin_init(pthread_spinlock_t *lock, int pshared);
  • lock:指向自旋锁变量的指针。
  • pshared
    • PTHREAD_PROCESS_PRIVATE(默认):仅在同一进程的线程间共享。
    • PTHREAD_PROCESS_SHARED:可在不同进程间共享(需要共享内存支持)。
  • 返回值:成功返回 0,失败返回错误码

销毁

int pthread_spin_destroy(pthread_spinlock_t *lock);

注意:必须在未被任何线程持有的时候销毁

忙等待加锁(就是一直轮询)

int pthread_spin_lock(pthread_spinlock_t *lock);

尝试加锁(非阻塞)

int pthread_spin_trylock(pthread_spinlock_t *lock);

可用于尝试特定的次数,不至于一直忙等待
解锁

int pthread_spin_unlock(pthread_spinlock_t *lock);

总的来讲,使用上和互斥锁没什么区别,知道获取锁的时候是一直轮询,忙等待就行了。

二、读写锁

1. 基本介绍

读写锁,我们学习读者写者模型,通过对比生产消费模型。
读者写者模型的"321"原则:

  • 三种关系:
    • 写者与写者:互斥关系
    • 写者与读者:互斥 + 同步
    • 读者与读者:并发关系(也就是没有关系,可以同时读)
  • 两种角色:读者和写者
  • 一个交易场所:公共资源

和生产者消费者模型的主要区别是:读者和读者之间没有关系,因为读者写者模型中,读者并不会把资源拿走

2. 实现

如何实现呢?

读者去读

  • 用一个计数器记录读者的数量
  • 第一个读者读的时候(读者数量从 0 → 1),把写者的锁(这个锁是维护公共资源的锁)拿走(让写者无法访问公共资源)
  • 每一个读者进入都要对读者数量进行++操作(注意这个计数器也是公共资源,要有另一把锁来维护这个计数器)
  • 然后读者可以读

写者去写

  • 只有能拿到锁的时候才能去写(也就是读者数量为 0,把锁给释放了的时候)

饥饿特性

  • 读者写者模型有一个饥饿特性!在C++库中默认是读者优先,写者饥饿的(因为写独占,读共享,读锁优先级高)
  • 读者优先:当有读者正在读取时,新到达的读者会立即被允许进入读取区,而写者则会被阻塞,直到所有读者都离开读取区(读锁内部有读者计数)。
    • 当然也不是完全没机会:在读者都在处理数据的时候,写者就有机会进入写

在这里插入图片描述

  • 写者优先:当写者请求写入权限时,系统会尽快地让写者进入写入区,即使此时有读者正在读取。这通常意味着一旦有写者到达,所有后续的读者都会被阻塞,直到写者完成写入并离开写入区

3. 接口

初始化

int pthread_rwlock_init(pthread_rwlock_t *rwlock, const pthread_rwlockattr_t *attr);
  • 默认是读者优先的(要设置写者优先也可以,但是比较复杂)
  • rwlock:指向读写锁变量的指针。
  • attr:读写锁属性,通常设为 NULL(使用默认属性)。
  • 返回值:成功返回 0,失败返回错误码

销毁

int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);

加锁(读锁)
多个线程可以同时持有读锁,适用于只读操作
阻塞版本

int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);
  • 如果当前没有写锁,则获取读锁(允许其他读锁继续获取)。
  • 如果有写锁,则阻塞直到写锁释放。

非阻塞

int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);
  • 果锁不可用,立即返回EBUSY,而不是阻塞。

加锁(写锁)
写锁是独占的,同一时间只能有一个线程持有写锁
阻塞版本

int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);
  • 如果当前没有读锁或写锁,则获取写锁。
  • 否则阻塞,直到所有读锁和写锁释放。

非阻塞版本

int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);
  • 如果锁不可用,立即返回 EBUSY

解锁

int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);
  • 释放读锁或者写锁

🌈我的分享也就到此结束啦🌈
要是我的分享也能对你的学习起到帮助,那简直是太酷啦!
若有不足,还请大家多多指正,我们一起学习交流!
📢公主,王子:点赞👍→收藏⭐→关注🔍
感谢大家的观看和支持!祝大家都能得偿所愿,天天开心!!!

http://www.dtcms.com/wzjs/61120.html

相关文章:

  • 网络推广工具有哪些seo信息查询
  • 建网站 教程如何在网上推广自己的公司
  • 百度网盘做视频网站网络营销的特点和优势
  • 哪家网络公司做网站好百度商务合作联系
  • HTML5怎么做自适应网站市场营销试题库(带答案)
  • 郑州的网站建设公司哪家好企业网站优化服务公司
  • 丰台周边网站建设网络品牌营销
  • 苏州市做网站2022最新版百度
  • wordpress后台504seo深圳培训班
  • 毕业设计网站做几个页面保温杯软文营销300字
  • 贵阳做网站哪家公司好全球搜索
  • 张家口网站建设电话网站搭建关键词排名
  • 惠州惠城网站建设住房和城乡建设部官网
  • 发表评论的wordpress网站模板域名推荐
  • 我想自己做的知道网站广州今日新闻头条新闻
  • 高端网站建设网络设计互联网信息化服务类友好链接
  • 做一个软件要多少钱广西网站seo
  • 淘客的手机网站加入网络营销公司
  • 西安哪里找做网站公司网络营销的内容有哪些方面
  • 品牌策划文案河北seo基础知识
  • 学会建网站如何做网络营销网站推广策略有哪些
  • 东莞证券官方网站seo网络推广到底是做什么的
  • 建筑外观设计网站推荐技术培训学校机构
  • 商城网站建设缺点华联股份股票
  • 广州皮具网站建设产品营销策划方案怎么做
  • 网站导航设计欣赏暴疯团队seo课程
  • 长春做网站电话谷歌外贸平台推广需要多少钱
  • 自己做的网站发到网上百度后台管理
  • 做视频投稿赚钱的网站好陕西网站建设网络公司
  • wordpress标签数量武汉搜索引擎排名优化