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

【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.dtcms.com/a/305398.html

相关文章:

  • scrapy框架新浪新闻
  • 使用JSON Schema 的 dependencies 实现 LLM 工具调用的参数约束
  • C 语言基础第16天:指针补充
  • 粒子群优化算法(Particle Swarm Optimization, PSO) 求解二维 Rastrigin 函数最小值问题
  • Mysql缓冲池和LRU
  • 关注 Yocto项目实战教程
  • PyCharm插件开发与定制指南:打造个性化开发环境
  • C++ 模板类型传递可行性检测指南
  • 3D打印喷头的基本结构
  • 区间DP求解策略详解
  • cmseasy靶机密码爆破通关教程
  • 第一章 RAG三问
  • flask使用celery通过数据库定时
  • 【专题十六】BFS 解决最短路径
  • Qt制作一个简单通信程序
  • C语言---万能指针(void *)、查找子串(strncmp函数的应用)多维数组(一维数组指针、二维数组指针)、返回指针值函数、关键字(const)
  • MongoDB系列教程-第一章:MongoDB简介、安装 、概念解析、用户管理、连接、实际应用示例
  • 数据结构-图的相关定义
  • 猎豹移动宣布控股UFACTORY,合计持股超80%
  • Oracle优化学习十六
  • Java高级技术知识点
  • 书籍推荐算法研究
  • 分布式链路追踪的实现原理
  • 系统学习算法:专题十五 哈希表
  • 第十一天:不定方程求解
  • windows下Docker安装路径、存储路径修改
  • LeetCode 刷题【19. 删除链表的倒数第 N 个结点、20. 有效的括号、21. 合并两个有序链表】
  • Ragflow 文档处理深度解析:从解析到存储的完整流程
  • 2025年06月 C/C++(三级)真题解析#中国电子学会#全国青少年软件编程等级考试
  • 删除不了文件(文件夹)需更改文件夹(文件)权限