96SEO 2026-02-19 11:41 3
如果某一个线程抢票能力过于强大把所有的票一个人都抢走了比如上面的线程4一个人就抢到了8088张票而线程2和线程3一张票都没有抢到这就造成了线程2和线程3的饥饿问题

在现实世界里这肯定是不行的秉持着公平公正的原则我们应该让这4个线程抢到的票都差不多才有实际意义。
所以互斥能解决抢票抢到负数的问题但是不能解决饥饿问题饥饿问题就需要线程同步去解决
pthread_cond_init(pthread_cond_t
pthread_cond_destroy(pthread_cond_t
pthread_cond_wait(pthread_cond_t
pthread_cond_broadcast(pthread_cond_t
pthread_cond_signal(pthread_cond_t
一个交易场所特定数据结构形式存在的一段内存空间两种角色生产角色消费角色生产线程消费线程三种关系生产与生产互斥关系
1个交易场指的就是共享资源临界资源有多个厂商生产者和多个用户消费者所以这就是我们常说的多线程的同步和互斥问题。
生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题。
生产者和消费者彼此之间不直接通讯而通过阻塞队列来进行通讯所以生产者生产完数据之后不用等待消费者处理直接扔给阻塞队列消费者不找生产者要数据而是直接从阻塞队列里取阻塞队列就相当于一个缓冲区平衡了生产者和消费者的处理能力。
这个阻塞队列就是用来给生产者和消费者解耦的。
如果生产者只生产了一份但是叫醒了5个消费者当一个消费者竞争锁结束取走仅有的一份商品那接下来的4个消费者就会看到空的队列如果是if因为之前已经判断过所以会直接执行下面取空的队列因此会直接报错但是如果是while的话仍需要判断队列是否已经满了因为当等待的线程被唤醒的时候继续从当前的位置进行执行代码
当条件满足线程唤醒pthread_cond_wait要求线程必须重新竞争_mutex锁竞争成功方可返回
nullptr);pthread_cond_init(_product_cond,
nullptr);pthread_cond_init(_consum_cond,
生产者用的接口{pthread_mutex_lock(_mutex);while(IsFull())
当条件满足线程唤醒pthread_cond_wait要求线性//
之前安全_productor_wait_num;pthread_cond_wait(_product_cond,
只要等待必定会有唤醒唤醒的时候就要继续从这个位置向下运行_productor_wait_num--;//
_block_queue.push(std::move(in));//
std::endl;_block_queue.push(in);//
0)pthread_cond_signal(_consum_cond);
pthread_cond_broadcastpthread_mutex_unlock(_mutex);}void
5个消费者{pthread_mutex_lock(_mutex);while(IsEmpty())
自动释放曾经持有的_mutex锁_consumer_wait_num;pthread_cond_wait(_consum_cond,
_block_queue.front();_block_queue.pop();//
0)pthread_cond_signal(_product_cond);pthread_mutex_unlock(_mutex);//
pthread_cond_signal(_product_cond);}~BlockQueue(){pthread_mutex_destroy(_mutex);pthread_cond_destroy(_product_cond);pthread_cond_destroy(_consum_cond);}private:std::queueT
我们之前学习了基于条件变量和阻塞队列实现空间可以动态分配的生产消费者模型今天我们来用POSIX信号量基于固定大小的环形队列重写这个程序。
POSIX信号量和SystemV信号量作用相同都是用于同步操作达到无冲突的访问共享资源目的。
pshared传入0值表示线程间共享传入非零值表示进程间共享。
POSIX信号量的PV操作是信号量机制中的核心它们分别代表了对信号量的等待P操作和释放V操作。
P操作也称为“申请资源”或“等待信号量”操作用于尝试减少信号量的值。
当线程或进程需要访问某个临界资源时它会执行P操作来申请信号量。
如果信号量的当前值大于0那么P操作会将信号量的值减1并立即返回表示申请资源成功。
如果信号量的当前值为0那么执行P操作的线程或进程将被阻塞直到信号量的值变为大于0即有其他线程或进程释放了信号量。
此时被阻塞的线程或进程会重新尝试P操作如果成功则信号量的值再次减1。
V操作也称为“释放资源”或“发布信号量”操作用于增加信号量的值。
当线程或进程完成对临界资源的访问后它会执行V操作来释放信号量。
V操作会将信号量的值加1。
如果有线程或进程因为信号量的值为0而被阻塞在P操作上那么V操作会唤醒其中一个被阻塞的线程或进程使其能够继续执行P操作并访问临界资源。
注意PV操作是原子的这意味着它们在执行过程中不会被其他线程或进程的打断。
这保证了信号量机制的正确性和可靠性。
环形队列当队列不为空或者满的时候真正实现了多线程同步。
当然生产者不能把消费者套一个圈消费者不能超过生产者。
这些都可以通过POSIX信号量的特性实现~
首先需要区分生产者和消费者生产者只关注空间消费者只关注资源。
生产者和消费者都需要进行PV操作生产者对应的将任务加入队列消费者对应的取出队列里的任务。
Consumer线程不断从环形队列中取出Task对象执行其操作并打印消费结果。
Productor线程则持续生成新的Task对象并将其放入队列中同时打印出生产信息。
并且还需要两把锁分别给生产者和消费者保证多线程并发的线程安全。
mutex){pthread_mutex_lock(mutex);}void
mutex){pthread_mutex_unlock(mutex);}
_consumer_step(0){sem_init(_room_sem,
0);pthread_mutex_init(_productor_mutex,
nullptr);pthread_mutex_init(_consumer_mutex,
生产行为P(_room_sem);Lock(_productor_mutex);//
一定有空间_ring_queue[_productor_step]
_cap;Unlock(_productor_mutex);V(_data_sem);}void
消费行为P(_data_sem);Lock(_consumer_mutex);*out
_ring_queue[_consumer_step];_consumer_step
_cap;Unlock(_consumer_mutex);V(_room_sem);}~RingQueue(){sem_destroy(_room_sem);sem_destroy(_data_sem);pthread_mutex_destroy(_productor_mutex);pthread_mutex_destroy(_consumer_mutex);}
定义锁维护多生产多消费之间的互斥关系pthread_mutex_t
_productor_mutex;pthread_mutex_t
所以多生产和多消费的意义不在于向队列中生产再从队列中拿走。
而在于生产前我们可以多线程并发获取原始任务生产后被我们的消费者拿走任务后可以多线程并发式的去执行各自的任务。
这才是多生产多消费的意义
多生产多消费的模型主要在于多个生产者去竞争一个名额然后进行加锁多个消费者竞争一个名额然后进行加锁所以最终还是会变成单生产单消费
作为专业的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