2026/2/11 17:04:48
网站建设
项目流程
南京微网站开发,如何注册微信小程序商家,项目管理软件的分类,嘉兴电子网站建设互斥锁#xff08;Mutex#xff0c;全称Mutual Exclusion#xff09;是多线程同步的基础机制#xff0c;核心作用是保证同一时间只有一个线程能进入临界区#xff0c;避免共享资源的并发读写冲突#xff0c;是解决数据竞争问题的核心工具。
一、核心作用
通过“加锁-解…互斥锁Mutex全称Mutual Exclusion是多线程同步的基础机制核心作用是保证同一时间只有一个线程能进入临界区避免共享资源的并发读写冲突是解决数据竞争问题的核心工具。一、核心作用通过“加锁-解锁”的原子操作实现临界区的互斥访问临界区访问共享资源如全局变量、共享内存的代码段互斥性一个线程持有锁时其他线程尝试加锁会被阻塞直到锁被释放。二、关键特性原子性加锁 lock 和解锁 unlock 操作是不可分割的不会被线程调度器打断唯一性同一时间只有一个线程能持有锁阻塞性未获取到锁的线程会进入阻塞状态而非轮询降低CPU资源消耗可重入性部分互斥锁支持同一线程多次加锁需对应次数解锁避免“线程自己锁死自己”。三、POSIX互斥锁C语言的核心函数以 pthread_mutex_t 为例Linux下常用函数功能pthread_mutex_init初始化互斥锁参数指定锁的属性如是否可重入、进程间共享pthread_mutex_lock尝试获取锁- 锁空闲立即获取并返回- 锁被占用阻塞当前线程直到锁被释放pthread_mutex_trylock尝试获取锁- 锁空闲获取并返回0- 锁被占用直接返回错误不阻塞pthread_mutex_unlock释放锁- 唤醒一个阻塞在该锁上的线程- 仅能由持有锁的线程调用pthread_mutex_destroy销毁互斥锁释放资源需确保锁已被释放四、典型使用流程保护共享变量#includepthread.h#includestdio.hpthread_mutex_tmutex;// 互斥锁intshared_var0;// 共享变量void*thread_func(void*arg){for(inti0;i10000;i){// 加锁进入临界区pthread_mutex_lock(mutex);shared_var;// 操作共享变量// 解锁离开临界区pthread_mutex_unlock(mutex);}returnNULL;}intmain(){pthread_mutex_init(mutex,NULL);// 初始化锁pthread_tt1,t2;pthread_create(t1,NULL,thread_func,NULL);pthread_create(t2,NULL,thread_func,NULL);pthread_join(t1,NULL);pthread_join(t2,NULL);printf(shared_var最终值%d\n,shared_var);// 正确输出20000无锁时可能小于20000pthread_mutex_destroy(mutex);// 销毁锁return0;}五、常见互斥锁类型按属性锁类型特点普通锁默认不可重入同一线程多次加锁会死锁。可重入锁同一线程可多次加锁需对应次数解锁适合递归/嵌套场景。进程间共享锁锁存储在共享内存中支持跨进程线程互斥默认仅限同进程。互斥锁和条件变量通常配合使用互斥锁保护共享资源的读写条件变量实现线程的等待-通知逻辑例如生产者-消费者模型中互斥锁保护队列的读写条件变量让消费者等待“队列非空”、生产者等待“队列不满”。