C语言的多线程并发锁方案主要依赖于POSIX线程库pthread。互斥锁核心行为当线程无法获取锁时会陷入睡眠让出CPU直到锁可用时被唤醒。适用场景通用场景特别是临界区执行时间较长如涉及I/O操作、复杂计算时。它能有效避免CPU资源的浪费。相关函数#include pthread.h /* 互斥锁初始化 mutex:指向要初始化的互斥锁对象的指针。 attr:指向互斥锁属性对象的指针。如果传入NULL则使用默认属性进行初始化(通常对应非递归、非检错类型的“快速锁”)。 */ int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr); /* 对指定的互斥锁进行加锁操作。 如果锁当前未被任何线程持有调用线程将立即获得锁并继续执行。 若锁已被其他线程持有调用线程将阻塞进入睡眠状态直到锁被释放。 */ int pthread_mutex_lock(pthread_mutex_t *mutex); /* 释放当前线程持有的互斥锁。 如果有其他线程正在等待该锁等待队列中的某个线程将被唤醒并获得锁。 */ int pthread_mutex_unlock(pthread_mutex_t *mutex); /* 销毁一个互斥锁释放其可能占用的资源(如内核资源、动态内存等)。 */ int pthread_mutex_destroy(pthread_mutex_t *mutex);自旋锁核心行为自旋锁是另一种重要的同步机制它的核心行为与互斥锁有本质的不同当锁被占用时等待线程会在一个循环中不断检查即旋转而不会像互斥锁那样陷入睡眠。适用场景锁持有时间极短且临界区执行很快如仅改变一个变量。#include pthread.h /* 初始化自旋锁。 pashread参数决定锁的共享范围 PTHREAD_PROCESS_PRIVATE:只能在初始化该锁的进程内的线程间使用默认、常用。 PTHREAD_PROCESS_SHARED:允许在不同进程的线程间使用锁需位于共享内存。 */ int pthread_spin_init(pthread_spinlock_t *lock, int pashread); /* 加锁。如果锁已被占用调用线程将一直旋转占用CPU循环检查直到锁可用。 */ int pthread_spin_lock(pthread_spinlock_t *lock); /* 解锁。 */ int pthread_spin_unlock(pthread_spinlock_t *lock); /* 销毁自旋锁释放其占用的资源。 */ int pthread_spin_destory(pthread_spinlock_t *lock);原子指令原子指令是硬件级别提供的工作保证对一个内存位置的读---修改---写过程是不可分割的在执行期间 不会被其他线程或中断打断。获取并增减Fetch-and Add)// 原子加法操作fetch-and-add int inc(int *value, int add) { int old; __asm__ volatile( lock; xaddl %2, %1; :a (old) :m(*value), a(add) :cc,memory ); return old; }比较和交换(Compare-and-Swap,CAS)// 比较和交换Compare-and-Swap / Compare-and-Set // 这是一种用于多线程编程的原子指令用于实现并发算法中的同步。 // 作用 它比较一个内存位置的值和给定的值只有在相同的情况下 // 才会将该内存位置的值修改为新的给定值。这个过程是原子的不可中断的 // 可以防止数据竞争。 int inc_cas(int *value, int add) { int old, newVal, expected; expected *value; do { old expected; newVal old add; __asm__ volatile( lock cmpxchg %2, %1 : a(expected), m(*value) : r(newVal), 0(old) : cc, memory ); } while (expected ! old); return old; }条件变量互斥锁条件变量是线程同步中等待某个条件成立的重要工具。它总是与互斥锁配合使用因为条件的检查与状态的改变必须在同一把锁的保护下进行以避免竞态条件。考虑一个常见的场景生产者-消费者问题。消费者需要等待队列非空才能取数据生产者往队列放入数据后通知消费者。如果只用互斥锁消费者可能需要循环检查队列状态忙等待浪费CPU,或者无法在条件不满足时高效的让出CPU。条件变量解决了这个问题它允许一个线程在条件不满足时阻塞休眠并释放互斥锁当条件被改变时另一个线程可以唤醒等待的线程使其重新获取锁并继续执行。条件变量相关函数/* 作用动态初始化条件变量。 参数 cond指向条件变量的指针。 attr属性指针通常传 NULL 使用默认属性。 返回值成功返回 0失败返回错误码。 */ int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr); /* 作用销毁条件变量释放资源。 注意销毁前必须确保没有线程在等待该条件变量。 返回值成功返回 0失败返回错误码。 */ int pthread_cond_destroy(pthread_cond_t *cond); /* 作用原子地完成以下操作 释放已持有的互斥锁 mutex。 将调用线程阻塞直到条件变量 cond 被唤醒。 被唤醒后重新获取 mutex 并返回。 参数cond 条件变量mutex 当前线程必须已经持有的互斥锁。 注意返回后必须重新检查条件防止虚假唤醒。 返回值成功返回 0失败返回错误码。 */ int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex ); /* 唤醒一个正在等待该条件变量的线程。 返回值成功返回 0失败返回错误码。 */ int pthread_cond_signal(pthread_cond_t *cond); /* 唤醒所有正在等待该条件变量的线程。 返回值成功返回 0失败返回错误码。 */ int pthread_cond_broadcast(pthread_cond_t *cond);条件变量互斥锁使用模式等待条件消费者pthread_mutex_lock(mutex); while (条件为假) { // 必须用 while 循环 pthread_cond_wait(cond, mutex); // 原子操作解锁 等待 } // 此时条件为真且持有 mutex执行相应操作 pthread_mutex_unlock(mutex);改变条件并通知 生产者pthread_mutex_lock(mutex); // 修改共享状态使条件变为真 pthread_cond_signal(cond); // 或 pthread_cond_broadcast pthread_mutex_unlock(mutex);