96SEO 2026-02-20 00:39 0
的代码就叫做临界区互斥任何时刻互斥保证有且只有一个执行流进入临界区访问临界区资源通常对临界资源起保护作用原子性不会被任何调度机制打断的操作该操作只有两个状态要么完成要么未完成

大部分情况下线程使用的数据都是局部变量变量的地址空间在线程栈空间中这种情况下变量归属于单个线程其他线程无法获得这种变量。
但是有的时候很多变量都需要在线程间共享这样的变量称为共享变量可以通过数据的共享完成线程之间的交互。
多个线程并发的操作共享变量会带来一些问题。
tickets);tickets--;}elsebreak;}
route);t1.Start();t2.Start();t3.Start();t4.Start();t1.Join();t2.Join();t3.Join();t4.Join();return
计算机常用的数据类型分为两种算术运算逻辑运算。
CPU在计算过程中其操作过程不是原子的是需要分成好几个步骤的。
第一步要先将数据移动到寄存器中第二步进行逻辑判断第三步将结果发出
在计算机中CPU有时只有一套但是寄存器中的数据是可以有多套的。
多个线程根据时间片进行交替执行因为寄存器中的数据属于线程私有看起来是放在一套共有的寄存器中但是当线程要被切走的时候线程是需要带走自己的数据当线程回来的时候线程需要将数据进行恢复。
假设票数只剩下一张进程A看见还有一张进行买票但是在买票的过程中突然被切出进程B进入买票梅开二度在买票的过程中突然被切出...当进程A恢复线程进行减减操作票数为0退出进程B恢复线程记住现在tickets的票数为0减减重读数据将tickets为0读入将tickets减为负数之后的线程同理。
这个模拟漫长业务的过程在这个漫长的业务过程中可能有很多个线程会进入该代码段
通过汇编代码我们可以发现这种操作不是原子性操作而是分别对应于三条汇编指令
load将共享变量ticket从内存中加载到寄存器中update更新寄存器里面的值执行
操作store更新值从寄存器写回共享内存ticket的内存地址
代码必须有互斥行为当代码进行临界区执行时不允许其他线程进入该临界区如果多个线程同时要求执行临界区的代码并且临界区没有线程执行那么只能允许一个线程进入给临界区如果线程不在临界区中执行那么线程不能组织其他线程进去临界区
要做到上述三点本质上需要一把锁。
Linux上提供的这把锁叫做互斥量。
pthread_mutex_init(pthread_mutex_t
该函数用于C函数的多线程编程中互斥锁的初始化。
在任何时候只允许一个线程进行访问。
函数的参数
mutex指向要初始化的互斥锁的变量本身restrictattr指定了新建互斥锁的属性。
如果参数restrictattr为空(NULL)则使用默认的互斥锁属性默认属性为快速互斥锁
。
互斥锁的属性在创建锁的时候指定在LinuxThreads实现中仅有一个锁类型属性不同的锁类型在试图对一个已经被锁定的互斥锁加锁时表现不同。
PTHREAD_MUTEX_TIMED_NP这是缺省值也就是普通锁。
当一个线程加锁以后其余请求锁的线程将形成一个等待队列并在解锁后按优先级获得锁。
这种锁策略保证了资源分配的公平性。
PTHREAD_MUTEX_RECURSIVE_NP嵌套锁允许同一个线程对同一个锁成功获得多次并通过多次unlock解锁。
如果是不同线程请求则在加锁线程解锁时重新竞争。
PTHREAD_MUTEX_ERRORCHECK_NP检错锁如果同一个线程请求同一个锁则返回EDEADLK否则与PTHREAD_MUTEX_TIMED_NP类型动作相同。
这样就保证当不允许多次加锁时不会出现最简单情况下的死锁。
PTHREAD_MUTEX_ADAPTIVE_NP适应锁动作最简单的锁类型仅等待解锁后重新竞争。
pthread_mutex_init(pthread_mutex_t
对于一个已经加锁的互斥量不要进行销毁对于已经销毁的互斥量要确保后面不会有线程在尝试加锁。
pthread_mutex_destroy(pthread_mutex_t*
进行互斥量的销毁对于一个已经加锁的互斥量不要进行销毁对于已经销毁的互斥量要确保后面不会有线程在尝试加锁。
pthread_mutex_lock(pthread_mutex_t*
该函数用于对互斥锁进行加锁操作。
它阻塞调用线程直到可以获得互斥锁为止。
如果互斥锁已经被其他线程锁定则调用线程将被阻塞直到互斥锁被解锁。
函数的参数
pthread_mutex_trylock(pthread_mutex_t*
该函数是pthread_mutex_lock函数的非阻塞版本。
如果mutex参数所指定的互斥锁已经被锁定的话调用pthread_mutex_trylock函数不会阻塞当前线程而是立即返回一个值来描述互斥锁的状况。
pthread_mutex_unlock(pthread_mutex_t*
该函数用于解锁互斥锁它接收一个指向互斥锁的指针作为参数并将该互斥锁解锁。
所谓对临界资源进行保护本质上是对临界区代码进行保护我们对所有资源经访问本质都是通过代码进行访问。
保护资源本质上就是想办法把访问资源的代码进行保护起来。
解锁pthread_mutex_unlock(mutex);}else{//
解锁pthread_mutex_unlock(mutex);break;}}
ThreadDate{public:ThreadDate(const
lock):_name(name),_lock(lock){}public:std::string
在想要保护的临界区前面进行定义一个锁即可因为随着函数范围的释放该锁也会跟着解锁。
public:LockGuard(pthread_mutex_t*
mutex):_mutex(mutex){pthread_mutex_lock(_mutex);}~LockGuard(){pthread_mutex_unlock(_mutex);}private:pthread_mutex_t*
加锁的范围的粒度一定要尽量小任何线程要进行抢票都要先申请锁原则上不应该有例外所有线程申请锁前提是所有线程都要看到这把锁锁本身也是共享资源加锁的过程必须是原子的原子性要么不做要么做就要做完没有中间状态就是原子性如果线程申请锁失败了我的线程要被阻塞如果线程申请锁成功了继续向后进行运行如果线程申请锁成功了执行临界区的代码在执行临界区的代码期间可以进行切换其他线程无法进入因为我虽然被切换但是我没有进行释放我可以放心的执行完毕没有人可以打扰我。
总结所以对于其他线程要么我没有申请锁要么我释放了所对其他线程才有意义。
我访问临界区对于其他线程是原子的。
pthread_mutex_lock(pthread_mutex_t*
如何理解申请锁成功允许进入临界区申请锁成功pthread_mutex_lock函数会返回。
操作都不是原子的有可能会有数据一致性的问题所以为了实现互斥锁的操作大多数体系结构都提供了swap操作和exchange操作指令。
swap操作和exchange操作指令这种指令就是原子性的该指令的作用是把寄存器和内存单元的数据济宁相互交换由于只有一条指令保证了原子性即使是多处理平台进行访问访问内存的总线周期也有先后一个处理器上的交换指令执行时另一个交换指令只能等待总线周期。
lock在内存中开辟一段空间我们可以在这段空间中放入一些值来使线程具有互斥性。
比如当lock中的数字为1说明我们可以进行该临界区同时将lock中的数字进行交换变为0当lock中的数字变为0说明我们不能进入该临界区需要进行挂起等待然后重新进行lock的判断。
举个例子首先这个锁处于无人状态。
现在有一个线程A进行lock中将lock中的数字和al寄存器的数字进行交换然后现在al寄存器中的数字为1大于0说明我们可以进入临界区中。
之后随着时间片的轮转线程A要被切走对于线程A在CPU寄存器中的所有数据也要跟着一起切走然后此时lock中的数字为依旧为0其他线程中的al寄存器中的数字也为0所以其他线程无法进行该临界区也就是将其他线程全部都锁在了外面只有当线程A完成打开锁之后其他线程才能进入该临界区中。
我们在来看一看这个unlock操作等待线程A操作完之后我们需要直接将数字1赋值给mutex内存中之后唤醒其他等待Mutex的线程。
CPU的寄存器只有一套被所有的线程共享但是寄存器里面的数据属于执行流的上下文属于执行零私有的数据CPU在执行代码的时候一定要有对应的执行载体线程或者进程数据在内存中被所有线程共享
把数据从内存中移动到CPU寄存器中本质上就是把数据从共享变为线程私有。
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback