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

h5做招聘网站可以吗贵州省住房和城乡建设厅网站报名网

h5做招聘网站可以吗,贵州省住房和城乡建设厅网站报名网,如何建立竞价网站,网站设计器💓个人主页:mooridy 💓专栏地址:Linux 关注我🌹,和我一起学习更多计算机的知识! 🔝🔝🔝 前置知识 临界资源:多线程执行流共享的资源就叫做临界资源临界区&am…

💓个人主页:mooridy
💓专栏地址:Linux
关注我🌹,和我一起学习更多计算机的知识!
🔝🔝🔝

前置知识

  • 临界资源:多线程执行流共享的资源就叫做临界资源
  • 临界区:每个线程内部,访问有临界资源的代码,就叫做临界区
  • 原子性:不会被任何调度机制打断的操作,该操作只有两态,要么完成,要么未完成

线程互斥

什么是互斥?

互斥保证有且只有一个执行流进入临界区,访问临界资源,通常对临界资源起保护作用。

为啥需要互斥?
  • ⼤部分情况,线程使⽤的数据都是局部变量,变量的地址空间在线程栈空间内,这种情况,变量归属单个线程,其他线程⽆法获得这种变量。

  • 但有时候,很多变量都需要在线程间共享,这样的变量称为共享变量,可以通过数据的共享,完成线程之间的交互。

多个线程并发的操作共享变量,可能会出现一些问题,比如下面这种情况。
![[Pasted image 20250328201239.png]]
像i++这样的操作并不是原子的,它的底层汇编代码有三句,即上图红色的三步。如果在这中间发生时钟中断,就会导致结果异常。
要解决这种问题,我们需要保证几个条件:

  • 代码必须要有互斥行为:当代码进入临界区执行时,不允许其他线程进入该临界区。
  • 如果多个线程同时要求执行临界区的代码,并且临界区没有线程在执行,那么只能允许一个线程进入该临界区。
  • 如果线程不在临界区中执行,那么该线程不能阻止其他线程进入临界区。

要实现这些条件,我们就需要一把,Linux上我们把这把锁叫做互斥量
![[Pasted image 20250328202101.png]]

互斥量的接口
初始化互斥量
方法 1:静态分配
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
  • 解释:这种方式是在编译时对互斥量进行初始化,它是一种简单直接的初始化方式。PTHREAD_MUTEX_INITIALIZER 是一个宏,它为互斥量提供了默认的初始值。使用这种方式初始化的互斥量,其生命周期与包含它的变量相同,并且不需要手动调用销毁函数来释放资源。这种方式适合那些在程序运行期间一直存在且不需要动态调整属性的互斥量。
方法 2:动态分配
int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr);
  • 参数解释
    • mutex:这是一个指向 pthread_mutex_t 类型的指针,代表要初始化的互斥量。在调用该函数时,需要提供一个有效的 pthread_mutex_t 变量的地址。
    • attr:这是一个指向 pthread_mutexattr_t 类型的指针,通常将其设置为 NULL。当设置为 NULL 时,表示使用默认的互斥量属性。
  • 返回值
    • 若初始化成功,函数返回 0
    • 若出现错误,函数会返回一个非零的错误码。
销毁互斥量
int pthread_mutex_destroy(pthread_mutex_t *mutex);
注意事项
  • 静态初始化的互斥量:用 PTHREAD_MUTEX_INITIALIZER 初始化的互斥量不需要销毁,因为它是静态分配的,其资源会在程序结束时自动释放。
返回值
  • 若销毁成功,函数返回 0
  • 若出现错误,函数会返回一个非零的错误码。
互斥量加锁和解锁
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
返回值
  • 成功返回 0
  • 失败返回错误号。
pthread_mutex_lock 调用情况分析
  • 互斥量未锁状态:当互斥量处于未锁状态时,pthread_mutex_lock 函数会将互斥量锁定,同时返回成功。这意味着当前线程成功获得了对共享资源的访问权,其他线程在该互斥量解锁之前无法获得访问权。
  • 互斥量已锁状态:当发起函数调用时,如果其他线程已经锁定了互斥量,或者存在其他线程同时申请互斥量,但当前线程没有竞争到互斥量,那么 pthread_mutex_lock 调用会陷入阻塞(执行流被挂起)。此时,当前线程会暂停执行,直到互斥量被解锁,然后再次尝试获取互斥量。

线程同步

什么是同步?
  • 所谓同步,在保证数据安全的前提下,让线程能够按照某种特定的顺序访问临界资源,从而有效避免饥饿问题
    e.g.「操作 A 应在操作 B 之前执行」,「操作 C 必须在操作 A 和操作 B 都完成之后才能执行」
如何实现同步?

线程同步需要由条件变量来实现。
条件变量是一种机制。当线程持有锁进入临界区后,如果发现资源未就绪,它可以释放锁并进入等待状态。当其他线程将资源准备好后,会通过条件变量通知等待的线程。这样等待的线程就不需要频繁地检测资源是否就绪,一旦资源就绪就会被通知来访问资源,从而避免了 CPU 资源的浪费。

条件变量函数
初始化
int pthread_cond_init(pthread_cond_t *restrict cond, const pthread_condattr_t *restrict attr);

此函数用于初始化一个条件变量。

参数

  • cond:这是一个指向 pthread_cond_t 类型的指针,代表要初始化的条件变量。在调用该函数时,需提供一个有效的 pthread_cond_t 变量的地址,这样函数才能对其进行初始化操作。
  • attr:这是一个指向 pthread_condattr_t 类型的指针,通常将其设置为 NULL。当设置为 NULL 时,表示使用默认的条件变量属性。如果需要自定义条件变量的属性,可先创建一个 pthread_condattr_t 类型的变量,对其进行相应的设置,然后将其地址传递给该参数。

返回值

  • 若初始化成功,函数返回 0
  • 若出现错误,函数会返回一个非零的错误码。
销毁
int pthread_cond_destroy(pthread_cond_t *cond);

该函数用于销毁一个已经初始化的条件变量。

参数

  • cond:这是一个指向 pthread_cond_t 类型的指针,代表要销毁的条件变量。在调用该函数时,需提供一个已经初始化的 pthread_cond_t 变量的地址。

返回值

  • 若销毁成功,函数返回 0
  • 若出现错误,函数会返回一个非零的错误码。
等待条件满足
int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex);

此函数用于让当前线程在指定的条件变量上等待,直到其他线程通过 pthread_cond_signalpthread_cond_broadcast 函数唤醒它。

参数

  • cond:这是一个指向 pthread_cond_t 类型的指针,代表要在这个条件变量上等待。当前线程会在该条件变量上进入阻塞状态,直到条件满足被唤醒。
  • mutex:代表一个互斥量。在调用 pthread_cond_wait 函数之前,当前线程必须已经锁定了该互斥量。在函数内部,它会自动解锁该互斥量,并让线程进入等待状态。当线程被唤醒后,它会自动重新锁定该互斥量。

返回值

  • 若线程成功被唤醒并重新锁定互斥量,函数返回 0
  • 若出现错误,函数会返回一个非零的错误码。
唤醒等待
int pthread_cond_broadcast(pthread_cond_t *cond);
int pthread_cond_signal(pthread_cond_t *cond);

这两个函数用于唤醒在指定条件变量上等待的线程。

pthread_cond_broadcast 函数

该函数会唤醒所有在指定条件变量 cond 上等待的线程。

pthread_cond_signal 函数

该函数会唤醒在指定条件变量 cond 上等待的一个线程。


文章转载自:

http://DWFIjGzS.thbqp.cn
http://haoOnxlq.thbqp.cn
http://aUpBd80h.thbqp.cn
http://EI53jb7Q.thbqp.cn
http://oXlf2TWi.thbqp.cn
http://hrLh0vy9.thbqp.cn
http://LYaDgJfu.thbqp.cn
http://I7ySZEi2.thbqp.cn
http://kzolFNAY.thbqp.cn
http://HD5hqNeH.thbqp.cn
http://SP13cpH5.thbqp.cn
http://V1W9WgYW.thbqp.cn
http://sRMLfXyc.thbqp.cn
http://GTiJptHv.thbqp.cn
http://C4QA1Pp8.thbqp.cn
http://s9bZgNg9.thbqp.cn
http://xsNMPy40.thbqp.cn
http://PuM3IxUz.thbqp.cn
http://UrhN4Ci4.thbqp.cn
http://klvDqpNA.thbqp.cn
http://a6a7NmyM.thbqp.cn
http://7b0U3Gdo.thbqp.cn
http://pwfKUVK8.thbqp.cn
http://pKAglkFU.thbqp.cn
http://VK1Q2iTm.thbqp.cn
http://kz1DjZBF.thbqp.cn
http://jODsyrGG.thbqp.cn
http://9nF7b5C6.thbqp.cn
http://qDuBBEA3.thbqp.cn
http://GThPZODo.thbqp.cn
http://www.dtcms.com/wzjs/618516.html

相关文章:

  • 做神马网站快速排哪个网站可以做全景图
  • 嘉定区建设局网站做网站时连服务器上的数据库
  • 公司制作网站怎么做郑州最新防疫进展
  • 中国建设教育协会官方网站网站注册页面跳出怎么做
  • js网站模板怎么用临沂网站开发公司电话
  • 做聚美优品网站得多少钱自己怎么做网站空间
  • 男女做特别污污的事情网站苏州保洁公司电话号码
  • 网站建设会计买域名做网站表白
  • 购房者网站自媒体平台前十名
  • 我的世界怎么做神器官方网站wordpress的链接怎么设置方法
  • 建设网站 软件网络营销常用工具有哪些?
  • 企业做网站的意义企业公司网站开发
  • 用eclipse编程做网站国外网站 备案
  • 购物网站首页设计鄂州市官网
  • 闵行交大附近网站建设南京百度提升优化
  • 邢台开发区建设小学官方网站网站建设与维护设计大作业
  • 东莞建设网站企业沟通平台建设网站注册会员
  • 淮南商城网站建设地址广西网站建设制作
  • 有没有网站可以做地图做网站需要有
  • 英文网站建设深圳wordpress显示数据库请求
  • 台州专业网站设计系统网站开发技术一般需要什么语言
  • 网站申请网站建设及制作教程
  • 湖北省建设厅官方网站证书查询做公司网站解析
  • 企业网站怎么做产品图片轮播小程序api有哪些
  • 保定企业制作网站开淘宝店怎么做充值网站
  • 一站式服务平台登录网站模板 站长之家
  • 绍兴网站推广排名wordpress 淘宝客 插件
  • 重庆企业网站建设哪家好wordpress 1.0
  • 做企业网站的前景武陟网站建设
  • 建设银网站.net空网站做九九乘法表