Linux线程同步实战:多线程程序的同步与调度
个人主页:chian-ocean
文章专栏-Linux
Linux线程同步实战:多线程程序的同步与调度
- 个人主页:chian-ocean
- 文章专栏-Linux
- 前言:
- 为什么要实现线程同步
- 线程饥饿(Thread Starvation)
- 示例:抢票问题
- 条件变量
- 条件变量的工作原理
- 常用操作:
- `pthread_cond_wait`
- `pthread_cond_signal`
- `pthread_cond_broadcast`
- 基于条件变量的生产消费者模型(阻塞队列)
- 生产-消费者模型(也叫做游有界缓冲区)
- 模型原理
- 工作原理
- 同步机制
- 阻塞队列
- 关键点分析
- 错误与改进:
- 生产消费模型
- 基于信号量的生产-消费者模型(环形队列)
- POSIX信号量
- 模型原理
- 工作原理
- 同步机制
- 环形队列
- 详细分析:
- 类成员变量:
- 构造函数:
- 析构函数:
- `push()` 方法(生产者操作):
- `pop()` 方法(消费者操作):
- 主函数
- 消费者线程函数 (`cosumer`)
- 生产者线程函数 (`productor`)
- 主函数 (`main`)
前言:
Linux 是一个多任务操作系统,它通过提供多种线程同步机制来帮助开发人员有效地管理线程之间的协作与冲突。正确的线程同步不仅能避免这些问题,还能提升程序的可靠性和性能。
为什么要实现线程同步
线程饥饿(Thread Starvation)
线程饥饿是指在多线程程序中,某些线程因为无法获取到所需的资源,长时间被阻塞,导致无法执行,甚至永远无法执行。这种情况通常发生在低优先级线程无法获得 CPU 时间,或者无法获得必要的锁资源时。线程饥饿会导致系统资源无法得到充分利用,程序的性能和响应性也会下降。
示例:抢票问题
- 最初的抢票问题出现了读写数据不一致问题,我们通过加锁解决了问题。
#include #include #include using namespace std; // 定义常量 NUM 表示创建线程的数量 #define NUM 10 // 初始化互斥锁 mutex,用于保护共享资源 tickets pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; // 定义共享资源 tickets,用于模拟票的数量 int tickets = 1000; // 线程的工作函数,用于抢购票 void* SanpUpTichets(void* args) { // 将当前线程与主线程分离,确保线程结束时可以自动回收资源 pthread_detach(pthread_self()); // 无限循环,模拟持续抢票 while(true) { // 加锁,保护共享资源 tickets pthread_mutex_lock(&mutex); // 如果还有票 if(tickets > 0) { // 打印当前线程的信息和剩余票数 cout // 如果票已经抢完,解锁并跳出循环 pthread_mutex_unlock(&mutex); break; } // 解锁,允许其他线程访问 pthread_mutex_unlock(&mutex); // usleep(20); // 如果需要模拟延迟,可以解开注释 } return nullptr; } int main() { // 创建 NUM 个线程,模拟多个线程同时抢购票 for(int i = 0 ; i
- 最初的抢票问题出现了读写数据不一致问题,我们通过加锁解决了问题。
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。