Linux线程概述
Linux线程是轻量级进程(LWP),属于某个进程并共享其资源(如内存),但各自拥有独立的栈区。相比进程,线程的优势在于创建开销小(仅需分配8MB栈区,而进程需3GB空间)、并发度高,但稳定性较差——一个线程崩溃可能导致整个进程退出。
线程管理函数
创建线程
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg);thread: 返回线程IDattr: 线程属性(通常为NULL)start_routine: 线程执行的函数arg: 传递给函数的参数
获取线程ID
pthread_t pthread_self(void);线程退出
void pthread_exit(void *retval); int pthread_cancel(pthread_t thread);资源回收
int pthread_join(pthread_t thread, void **retval); // 阻塞回收 int pthread_detach(pthread_t thread); // 自动回收线程同步机制
互斥锁(Mutex)
用于保护临界资源,确保排他性访问:
pthread_mutex_t mutex; pthread_mutex_init(&mutex, NULL); // 初始化 pthread_mutex_lock(&mutex); // 加锁(原子操作) pthread_mutex_unlock(&mutex); // 解锁 pthread_mutex_destroy(&mutex); // 销毁信号量(Semaphore)
实现线程间同步,支持PV操作:
sem_t sem; sem_init(&sem, 0, 1); // 初始化(二值信号量) sem_wait(&sem); // P操作(申请资源) sem_post(&sem); // V操作(释放资源) sem_destroy(&sem); // 销毁死锁条件
- 互斥条件:资源独占性
- 请求与保持:持有资源的同时请求新资源
- 非抢占:已获资源不可被强制剥夺
- 循环等待:线程间形成环形依赖链
调试命令
- 查看线程信息:
ps -eLo pid,ppid,lwp,stat,comm ps -eLf
关键注意事项
- 互斥锁保护的临界区应保持短小,避免休眠或耗时操作
- 信号量适用于存在多个同类资源的场景(初始值可>1)
- 分离线程(
pthread_detach)退出后系统自动回收资源 - 线程崩溃会连带终止所属进程,需谨慎处理错误边界