2026/6/9 17:25:22
网站建设
项目流程
浦口国家建设部网站,上海企业网站建设哪家好,没有网怎么装wordpress,wordpress留言表单在多线程开发中#xff0c;互斥和同步是解决 “资源竞争” 与 “执行顺序” 问题的核心技术#xff0c;本文结合原理 代码 图示详细解析。一、互斥#xff08;Mutex#xff09;#xff1a;临界资源的排他性访问1. 基本概念临界资源#xff1a;多线程中会被 “读写操作”…在多线程开发中互斥和同步是解决 “资源竞争” 与 “执行顺序” 问题的核心技术本文结合原理 代码 图示详细解析。一、互斥Mutex临界资源的排他性访问1. 基本概念临界资源多线程中会被 “读写操作” 的资源全局变量、文件、硬件设备等。排他访问同一时刻只能有一个线程访问临界资源。2. 问题场景多线程并发执行时若同时操作临界资源会出现数据不一致比如线程 A 执行A 1实际是 “读 A→运算→写 A” 三步但线程 B 可能在 A “读” 和 “写” 之间插入操作导致最终结果错误。3. 解决方案互斥锁通过互斥锁Mutex保证 “临界区代码” 的原子性同一时刻只有一个线程执行。互斥锁的使用步骤定义互斥锁初始化互斥锁加锁进入临界区执行临界区代码解锁退出临界区销毁互斥锁定义互斥锁初始化互斥锁加锁进入临界区执行临界区代码解锁退出临界区销毁互斥锁互斥锁相关函数POSIX 标准运行// 1. 定义互斥锁 pthread_mutex_t mutex; // 2. 初始化互斥锁 int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr); // 参数attrNULL表示默认属性返回值成功0/失败非0 // 3. 加锁阻塞等待直到拿到锁 int pthread_mutex_lock(pthread_mutex_t *mutex); // 说明加锁后其他线程无法进入临界区 // 4. 解锁 int pthread_mutex_unlock(pthread_mutex_t *mutex); // 说明解锁后其他线程可竞争锁 // 5. 销毁互斥锁 int pthread_mutex_destroy(pthread_mutex_t *mutex);互斥锁注意事项临界区代码要尽量短不要在临界区里 sleep、做耗时操作加锁和解锁必须是同一个线程避免 “锁泄露”。二、同步Semaphore有顺序的排他访问1. 基本概念同步是带顺序的互斥—— 不仅要 “排他访问资源”还要保证 “线程按指定顺序执行”。关系互斥是同步的超集同步是互斥的一个特例。2. 解决方案信号量信号量Semaphore是一种 “计数器”通过P/V操作控制资源的 “申请” 与 “释放”既可以实现互斥也可以实现同步。信号量的使用步骤定义信号量初始化信号量P操作申请资源执行代码V操作释放资源销毁信号量定义信号量初始化信号量P操作申请资源执行代码V操作释放资源销毁信号量信号量相关函数POSIX 标准运行// 1. 定义信号量 sem_t sem; // 2. 初始化信号量 int sem_init(sem_t *sem, int pshared, unsigned int value); // 参数 // - pshared0线程间共享非0进程间共享 // - value信号量初始值资源数量 // 返回值成功0/失败-1 // 3. P操作申请资源sem - 1 int sem_wait(sem_t *sem); // 说明若sem0直接减1并执行若sem0阻塞等待 // 4. V操作释放资源sem 1 int sem_post(sem_t *sem); // 说明释放后唤醒等待的线程 // 5. 销毁信号量 int sem_destroy(sem_t *sem);信号量的典型场景互斥初始值设为 1同一时刻 1 个线程访问资源同步初始值设为 0控制线程执行顺序比如线程 A 执行完再让线程 B 执行。三、互斥 VS 同步核心区别特性互斥Mutex同步Semaphore核心目标保护临界资源避免竞争控制线程执行顺序资源数量仅支持 “1 个资源” 的排他访问支持 “多个资源” 的并发访问value1操作主体加锁 / 解锁必须是同一个线程P/V 操作可以是不同线程临界区代码必须短小不能 sleep可包含耗时操作适当 sleep四、死锁多线程的 “陷阱”当多个线程互相等待对方持有的资源时会陷入 “永久阻塞” 状态这就是死锁。死锁的 4 个必要条件互斥条件资源同一时刻只能被一个线程使用请求与保持条件线程申请新资源时不释放已持有的资源不剥夺条件线程已持有的资源不能被强制剥夺循环等待条件多个线程形成 “循环等待资源” 的关系。如何避免死锁按固定顺序申请资源申请资源时超时放弃减少资源的 “持有时间”。五、总结互斥是 “保护资源”用 Mutex 实现同步是 “控制顺序”用 Semaphore 实现死锁是多线程的 “雷区”需通过资源申请顺序、超时等方式避免。