一.互斥锁互斥锁(Mutex,即Mutual Exclusion Lock)是并发编程中用于保护 “共享资源”的同步工具本质是一把 “独占钥匙”1.当多个线程同时读写共享资源时会出现 “竞态条件”导致数据错误2.互斥锁能强制线程 “排队访问” 资源避免竞争核心作用保证 “同一时刻只有一个线程能持有锁并访问共享资源”实现 “互斥访问”#include pthread.h1.pthread_mutex_init函数int pthread_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutexattr_t *restrict attr);动态初始化互斥锁mutex 指定要进行初始化的互斥锁变量attr 设置互斥锁的属性若传NULL使用系统默认属性pthread_mutex_t PTHREAD_MUTEX_INITIALIZER; --- 静态初始化互斥锁成功返回0 失败返回非0错误码2.pthread_mutex_lock函数int pthread_mutex_lock(pthread_mutex_t *mutex);用于获取互斥锁当互斥锁已被其他线程获取时调用该函数的线程会被阻塞直到互斥锁可用并成功获取mutex 互斥锁成功返回0 失败返回非0错误码3.pthread_mutex_trylock函数int pthread_mutex_trylock(pthread_mutex_t *mutex);用于获取互斥锁当互斥锁已被其他线程获取时调用该函数的线程不会被阻塞而是立即返回错误mutex 互斥锁成功返回0 失败返回非0错误码4.pthread_mutex_unlock函数int pthread_mutex_unlock(pthread_mutex_t *mutex);解锁一般使用时只有加锁的线程可以解锁mutex 互斥锁返回值 成功返回0 失败返回非0错误码5.pthread_mutex_destroy函数int pthread_mutex_destroy(pthread_mutex_t *mutex);销毁互斥锁mutex 互斥锁返回值 成功返回0 失败返回非0错误码二.条件变量cond条件变量是并发编程中用于实现线程间“等待-通知”机制的同步工具可让线程在某个条件不满足时挂起 待条件满足后被唤醒1.仅用互斥锁能保证共享资源访问的互斥性但无法解决 “线程需等待特定条件成立才能继续执行” 的 场景(比如生产者 - 消费者模型中消费者需等待生产者生产出数据才能消费)2.条件变量可结合互斥锁让线程在条件不满足时主动释放锁并等待条件满足时被唤醒以重新获取锁继续执行灵活应对依赖条件的同步需求核心作用实现线程间的 “条件等待与通知”使线程能在特定条件下协作避免线程忙等情况消耗 CPU 资源提升并发效率1.pthread_cond_init函数int pthread_cond_init(pthread_cond_t *restrict cond,const pthread_condattr_t *restrict attr);动态初始化条件变量cond 用于指定要初始化的条件变量attr 设置条件变量的属性若为NULL则使用系统默认属性pthread_cond_t cond PTHREAD_COND_INITIALIZER; --- 静态初始化条件变量成功返回0 失败返回非0错误码2.pthread_cond_signal函数int pthread_cond_signal(pthread_cond_t *cond);唤醒至少一个等待在指定条件变量(cond)上的线程cond 指定要操作的条件变量成功返回0 失败返回非0错误码3.pthread_cond_broadcast函数int pthread_cond_broadcast(pthread_cond_t *cond);唤醒所有等待在指定条件变量(cond)上的线程cond 指定要操作的条件变量成功返回0 失败返回非0错误码4.pthread_cond_wait函数int pthread_cond_wait(pthread_cond_t *restrict cond,pthread_mutex_t *restrict mutex);线程阻塞在条件变量cond上等待被唤醒同时该函数会自动释放传入的互斥锁mutex当线程被唤醒时又会自动重新获取该互斥锁保证了线程在等待条件过程中互斥锁的正确管道避免死锁等问题cond 用于指定线程等待的条件变量mutex 与条件变量配合使用保证线程在等待条件时的互斥成功返回0 失败返回非0错误码5.pthread_cond_destroy函数int pthread_cond_destroy(pthread_cond_t *cond);销毁条件变量相关的资源cond 要销毁的条件变量成功返回0 失败返回非0错误码三.无名信号量无名信号量是一种用于线程同步或进程同步的工具通过维护一个计数值来控制对共享资源的访问可限制同时访问资源的线程或进程数量1. 互斥锁只能保证同一时刻一个线程访问资源而有些场景需要允许多个线程同时访问2. 无名信号量的计数值可灵活设置能实现 “多线程有限并发访问” 或 “线程间的计数同步”补充互斥锁在多资源并发场景的不足核心作用通过计数值控制共享资源的并发访问数量支持多线程在一定限制下同时访问资源或实现线程间基于计数的同步协作#include semaphore.h1.sem_init函数int sem_init(sem_t *sem,int pshared,unsigned int value);初始化无名信号量sem 要初始化的信号量pshared:pshared 0信号量用于进程内的线程间同步(多个线程共享进程内存信号量仅在当前进程内有效)pshared ! 0信号量用于进程间同步(需将信号量放在共享内存中被多个进程映射后共同访问)value: 信号量的初始计数表示可用资源的初始数量value 1初始时有 1 个 “资源” 可用可用于实现互斥(一次一个线程/进程获取)value 0初始时没有“资源”可用调用 sem_wait 的线程/进程会阻塞直到sem_post增加计数成功返回0 失败返回-1重置错误码2.sem_wait函数P操作int sem_wait(sem_t *sem);信号量的值减1如果信号量的当前值大于 0减 1 后函数直接返回(表示“获取资源成功”)如果信号量的当前值等于 0sem_wait 会阻塞直到有其他线程/进程调用sem_post函数使得信号量值大于0后 再执行“减 1”并返回sem 无名信号量成功返回0 失败返回-1重置错误码(不会改变信号量的值)3.sem_post函数V操作int sem_post(sem_t *sem);释放信号量(将信号量的值1)sem 用于指定对哪个信号量进行释放操作成功返回0 失败返回-1重置错误码(不会改变信号量的值)4.sem_destroy函数int sem_destroy(sem_t *sem);销毁无名信号量释放该信号量相关的资源sem 指定对哪个信号量进行销毁操作成功返回0 失败返回-1重置错误码sem_getvalue (获取信号量当前值)四.线程的互斥与同步应用场景一.互斥锁1.应用场景特点单一共享资源同一时刻只允许一个线程访问主要用于防止数据竞争和不一致性问题2.优势实现简单易于理解和使用 能有效解决单一资源的互斥访问问题 保障数据的一致性和完整性3.局限性如果线程长时间持有锁可能导致其他线程长时间等待降低系统并发性能若使用不当容易产生死锁问题比如多个线程循环等待对方持有的锁二.条件变量1.应用场景特点线程需要在某个条件满足时才能继续执行配合互斥锁实现线程间的等待-通知机制2.优势避免线程的忙等待有效节省CPU资源 提高程序的运行效率可以实现更灵活的线程同步逻辑满足 复杂的条件等待和协作需求。3.局限性必须与互斥锁配合使用条件的判断和通知的时机需要准确把握否则可能导致线程无法正确唤醒或错过唤醒影响程序的正确性三.无名信号量1.应用场景特点限制对共享资源的并发访问数量 可用于线程或进程的同步和计数控制2.优势可以灵活控制并发访问的资源数量 适用于需要对资源进行定量管理的场景不仅能实现互斥还能进行计数同步 功能比互斥锁更丰富3.局限性信号量的计数管理需要准确设置和维护 容易出现资源过度使用或浪费的情况