目录1. 线程创建2. 线程退出3. 线程等待4. 线程取消5. 线程清理处理程序6. 互斥锁Mutex6.1 初始化6.2 上锁与解锁6.3 尝试上锁6.4 性能测量时间获取7. 自旋锁Spin Lock8. 读写锁Read-Write Lock9. 条件变量Condition Variable1. 线程创建函数原型int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg);参数说明thread指向线程标识符ID的指针用于获取新创建线程的 ID。attr线程属性指针传入 NULL 表示使用系统默认属性。可配置属性包括分离状态Detach State设为分离态后线程终止时自动回收资源无需主线程调用 pthread_join。栈空间大小Stack Size可手动调整线程栈内存既能缩小栈空间以提升高并发下的内存利用率又能增大栈空间防止溢出。调度策略与优先级Scheduling Policy Priority允许配置 SCHED_FIFO 或 SCHED_RR 等实时调度算法并指定线程优先级以满足高实时性或抢占式任务的需求。start_routine线程入口函数指针回调函数相当于子线程的 main 函数由操作系统调用。arg传递给线程入口函数的参数无参数时可传入 NULL。2. 线程退出线程退出的两种方式线程入口函数返回在入口函数中执行return (void*)value;。显式调用退出函数在任何位置调用void pthread_exit(void *retval);。3. 线程等待函数原型int pthread_join(pthread_t thread, void **retval);功能等待指定线程结束并获取其返回值。参数说明thread要等待的线程 ID。retval指向线程返回值的二级指针。若不需要获取返回值可传入 NULL。4. 线程取消取消线程int pthread_cancel(pthread_t thread);向指定线程发送取消请求。取消操作不会立即生效线程会运行到最近的“取消点”时才退出。设置取消点void pthread_testcancel(void);手动设置一个取消点允许线程在此处检查并响应取消请求。5. 线程清理处理程序压入清理函数void pthread_cleanup_push(void (*routine)(void *), void *arg);弹出清理函数void pthread_cleanup_pop(int execute);说明pthread_cleanup_push用于注册一个清理函数当线程被取消或调用pthread_exit时该函数会被自动调用。pthread_cleanup_pop用于移除最近压入的清理函数。若execute参数为 0则只弹栈不执行清理函数。若execute参数大于 0则弹栈并执行清理函数。注意push与pop必须成对出现且通常紧跟在可能分配资源的操作如malloc之后。特殊行为调用pthread_exit(NULL)会弹出所有已注册的清理函数并依次执行每个清理函数。6. 互斥锁Mutex6.1 初始化动态初始化int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr);mutex指向互斥锁变量的指针。attr互斥锁属性指针通常传入 NULL 表示默认属性。静态初始化pthread_mutex_t mutex PTHREAD_MUTEX_INITIALIZER;6.2 上锁与解锁int pthread_mutex_lock(pthread_mutex_t *mutex); int pthread_mutex_unlock(pthread_mutex_t *mutex);6.3 尝试上锁int pthread_mutex_trylock(pthread_mutex_t *mutex);尝试获取锁若成功则返回 0若锁已被占用则立即返回 EBUSY线程不会阻塞。6.4 性能测量时间获取int gettimeofday(struct timeval *tv, struct timezone *tz);用法示例struct timeval start, end; gettimeofday(start, NULL); // ... 临界区代码 ... gettimeofday(end, NULL); // 计算耗时秒 微秒 long seconds end.tv_sec - start.tv_sec; long useconds end.tv_usec - start.tv_usec; double elapsed seconds useconds / 1000000.0;7. 自旋锁Spin Lock概述自旋锁是一种高性能、低延迟的互斥锁。当线程尝试获取锁失败时不会进入休眠状态而是在 CPU 上执行“忙等待”Busy-waiting循环不断轮询直到锁被释放。特点消除了内核态上下文切换的开销。适用于临界区执行时间极短纳秒/微秒级的场景。若临界区执行时间较长会浪费大量 CPU 资源。初始化函数pthread_spin_init8. 读写锁Read-Write Lock概述读写锁是一种针对“读多写少”并发场景优化的锁机制。基本原则读读共享多个线程可以同时持有读锁。读写互斥读锁与写锁互斥。写写互斥同一时间只能有一个线程持有写锁。优势在大量读取、少量更新的场景下能显著提升系统吞吐量。初始化函数pthread_rwlock_init9. 条件变量Condition Variable概述条件变量是一种线程同步机制用于实现线程间的等待/通知模式。它允许线程在某个条件不满足时挂起等待直到其他线程改变条件并发出通知。核心函数int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex);功能让当前线程休眠等待直到某个特定条件成立被其他线程唤醒再继续执行。调用时内部会按顺序做 3 件事解锁并休眠原子操作自动把传入的互斥锁 mutex 解锁同时把当前线程放入 cond 的等待队列并让线程挂起休眠。等待唤醒线程处于阻塞状态完全不消耗 CPU直到其他线程发来唤醒信号。被唤醒并重新加锁被唤醒后它会重新去抢 mutex 锁。抢锁成功后pthread_cond_wait函数才会正式返回继续往下执行代码。典型使用模式// 1. 先加锁保护共享资源 pthread_mutex_lock(mutex); // 2. 使用 while 检查条件防止虚假唤醒 while (queue_is_empty) { // 条件不满足解锁并进入休眠被唤醒后自动重新加锁返回 pthread_cond_wait(cond, mutex); } // 3. 此时一定满足条件且已经持有锁安全地处理资源 pop_data_from_queue(); // 4. 操作完毕解锁 pthread_mutex_unlock(mutex);相关函数int pthread_cond_signal(pthread_cond_t *cond);- 唤醒等待在该条件变量上的一个线程int pthread_cond_broadcast(pthread_cond_t *cond);- 唤醒等待在该条件变量上的所有线程int pthread_cond_timedwait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex, const struct timespec *restrict abstime);- 带超时的等待