Linux C/C++编程 —— 线程技术总结
一、线程基本概念
线程是进程内的一个执行单元,多个线程共享进程的资源(如内存、文件描述符等),但每个线程拥有自己的寄存器、栈等。与进程相比,线程的创建、切换开销较小,能更高效地利用 CPU 资源。
二、线程创建与终止
-
创建 :在 Linux 下,使用 pthread 库的 pthread_create 函数创建线程。函数原型为 int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg); 参数 thread 存储创建成功后的线程 ID,attr 为线程属性(NULL 表示默认属性),start_routine 是线程执行的函数,arg 为传递给执行函数的参数。
-
终止 :线程可通过多种方式终止。一种是线程函数执行完毕正常退出;二是调用 pthread_exit 函数,参数用于返回线程的退出状态;三是其他线程调用 pthread_cancel 函数来终止指定线程。
三、线程同步与互斥
-
互斥锁(Mutex) :防止多个线程同时访问共享资源。使用 pthread_mutex_init 初始化互斥锁,pthread_mutex_lock 锁定互斥锁,pthread_mutex_unlock 解锁。需要注意避免死锁问题,如不同线程按不同顺序加锁。
-
条件变量 :让线程等待某个条件满足再继续执行。与互斥锁配合使用,pthread_cond_wait 会阻塞线程,直到另一个线程发出 pthread_cond_signal 或 pthread_cond_broadcast 信号。
-
读写锁(RWLock) :允许多个线程同时读共享数据,但写操作时只能有一个线程访问。适用于读操作多于写操作的场景,通过 pthread_rwlock_t 类型及相关操作函数实现。
四、线程属性设置
线程创建时可以设置属性,如分离状态(通过 pthread_attr_setdetachstate)。分离线程在终止时自动释放资源,而非分离线程需其他线程通过 pthread_join 来回收资源。
五 、线程局部存储(TLS)
为每个线程提供独立的变量副本,避免共享变量的同步问题。使用 pthread_key_create 创建键,pthread_setspecific 设置线程局部变量,pthread_getspecific 获取变量。
六、线程池
线程池预先创建一定数量的线程,避免频繁创建和销毁线程的开销。任务放入任务队列,线程从队列中获取任务执行。Linux 下可借助第三方库或自己实现简单的线程池。
七、性能优化与注意事项
-
合理控制线程数量,避免过度线程化导致上下文切换频繁。
-
在同步机制中,尽量减少锁的粒度,使用更高效的同步策略,如无锁编程(适用于简单场景,部分应用场景下性能更优)。
八、实际应用案例
-
在服务器开发中,使用多线程处理多个客户端连接,每个线程负责与一个客户端通信。
-
多媒体处理中,不同线程负责数据读取、处理、输出等不同阶段,提高处理效率。