当前位置: 首页 > java >正文

【Linux】pthread学习笔记

1. 线程基础

(1) 线程创建与终止
#include <pthread.h>
// 创建线程
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine)(void*), void *arg);
// 终止当前线程
void pthread_exit(void *retval);
// 等待线程结束
int pthread_join(pthread_t thread, void **retval);
// 分离线程(不可被join)
int pthread_detach(pthread_t thread);
  • 示例

    void* task(void *arg) {printf("Thread running\n");pthread_exit(NULL);
    }
    pthread_t tid;
    pthread_create(&tid, NULL, task, NULL);
    pthread_join(tid, NULL);
(2) 线程ID与比较
pthread_t tid = pthread_self();      // 获取自身线程ID
int equal = pthread_equal(tid1, tid2); // 比较线程ID

2. 线程同步机制

(1) 互斥锁(Mutex)
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; // 静态初始化
// 动态初始化/销毁
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr);
int pthread_mutex_destroy(pthread_mutex_t *mutex);
// 加锁/解锁
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
int pthread_mutex_trylock(pthread_mutex_t *mutex); // 非阻塞
  • 示例

    pthread_mutex_lock(&mutex);
    shared_data++;
    pthread_mutex_unlock(&mutex);
(2) 条件变量(Condition Variable)
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex); // 等待条件
int pthread_cond_signal(pthread_cond_t *cond); // 唤醒一个线程
int pthread_cond_broadcast(pthread_cond_t *cond); // 唤醒所有线程
  • 典型模式

    pthread_mutex_lock(&mutex);
    while (!condition) {pthread_cond_wait(&cond, &mutex);
    }
    // 操作共享数据
    pthread_mutex_unlock(&mutex);
(3) 读写锁(Read-Write Lock)
pthread_rwlock_t rwlock = PTHREAD_RWLOCK_INITIALIZER;
int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock); // 读锁
int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock); // 写锁
int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);

3. 线程属性控制

(1) 线程属性
pthread_attr_t attr;
pthread_attr_init(&attr);
// 设置分离状态
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
// 设置栈大小
pthread_attr_setstacksize(&attr, 1024 * 1024); // 1MB
// 使用属性创建线程
pthread_create(&tid, &attr, task, NULL);
pthread_attr_destroy(&attr);
(2) 调度策略与优先级
struct sched_param param;
param.sched_priority = 50; // 优先级(1~99)
// 设置调度策略(需root权限)
pthread_setschedparam(tid, SCHED_FIFO, &param);
// 获取当前策略
int policy;
pthread_getschedparam(tid, &policy, &param);

4. 线程局部存储(TLS)

// 创建线程局部变量键
pthread_key_t key;
pthread_key_create(&key, NULL);
// 设置/获取线程局部值
void *value = malloc(100);
pthread_setspecific(key, value);
void *data = pthread_getspecific(key);

5. 其他关键函数

函数用途
pthread_cancel(tid)取消目标线程(需线程设置为可取消状态)。
pthread_testcancel()显式插入取消点。
pthread_setcancelstate()设置线程取消状态(PTHREAD_CANCEL_ENABLE/DISABLE)。
pthread_once()确保某函数只执行一次(用于初始化)。

6. 常见问题与陷阱

(1) 线程安全函数
  • 非线程安全函数:如 strtoklocaltime,需使用线程安全版本(strtok_rlocaltime_r)。

(2) 死锁预防
  • 加锁顺序一致:多个锁按固定顺序获取。

  • 避免锁嵌套:尽量缩短临界区范围。

(3) 资源清理
  • 分离线程:若不需要 pthread_join,应显式 pthread_detach 避免资源泄漏。

  • 互斥锁销毁:动态初始化的锁必须 pthread_mutex_destroy


7. 调试工具

工具用途
valgrind --tool=helgrind检测数据竞争和死锁。
gdb调试多线程程序(info threadsthread <id>)。
strace -f跟踪线程的系统调用。

8. 与C++的对比

特性pthread (C)std::thread (C++11)
抽象级别底层(显式管理)高层(RAII封装)
错误处理返回错误码抛出异常
跨平台性Unix-like 系统跨平台
锁类型需手动初始化/销毁自动管理(std::mutexstd::lock_guard

总结

  • 核心原则:共享资源必须同步(互斥锁、条件变量)。

  • 性能优化:减少锁粒度,优先使用读写锁。

http://www.xdnf.cn/news/16651.html

相关文章:

  • 专业Python爬虫实战教程:逆向加密接口与验证码突破完整案例
  • ubuntu18.04制作raid0
  • 51c大模型~合集161
  • 代码随想录算法训练营第三十五天
  • 车载刷写架构 --- 整车刷写中为何增加了ECU 队列刷写策略?
  • idea运行tomcat日志乱码问题
  • PostgreSQL锁机制详解:从并发控制到死锁检测
  • STM32——HAL库
  • LangChain和LangGraph 里面的 `create_react_agent`有什么不同
  • 基于SpringBoot和Leaflet集成在线天气服务的区县当前天气WebGIS实战
  • VUE -- 基础知识讲解(一)
  • RabbitMQ工作模式
  • 【C#|C++】C#调用C++导出的dll之非托管的方式
  • C# _泛型
  • python线性回归:从原理到实战应用
  • 在 Vue 中,如何在回调函数中正确使用 this?
  • 单片机学习笔记.PWM
  • linux——ps命令
  • 【tips】小程序css ➕号样式
  • 站点到站点-主模式
  • cartographer 点云数据的预处理
  • 第二十四章:深入CLIP的“心脏”:Vision Transformer (ViT)架构全解析
  • vim的`:q!` 与 `ZQ` 笔记250729
  • 【C++算法】81.BFS解决FloodFill算法_岛屿的最大面积
  • 粒子群优化算法(Particle Swarm Optimization, PSO) 求解二维 Rastrigin 函数最小值问题
  • 本土化DevOps实践:Gitee为核心的协作工具链与高效落地指南
  • Python的垃圾回收机制
  • DAY21 常见的降维算法
  • 项目质量如何把控?核心要点分析
  • 【Pycharm】Python最好的工具