插件窝 干货文章 linux多线程编程的知识点有哪些

linux多线程编程的知识点有哪些

线程 pthread Mutex cond 881    来源:    2025-04-22

Linux多线程编程是系统编程的核心内容之一,涉及以下关键知识点:


1. 线程基础概念

  • 线程 vs 进程:线程是轻量级进程,共享同一进程的地址空间、文件描述符等资源,切换成本更低。
  • 线程共享与私有
    • 共享:全局变量、堆内存、文件描述符、静态变量。
    • 私有:线程ID、寄存器、栈、errno、信号掩码。

2. POSIX线程库(pthread)

  • 头文件#include <pthread.h>
  • 编译选项gcc -pthreadgcc -lpthread

3. 线程生命周期管理

  • 创建线程c int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg);
  • 终止线程

    • 线程函数返回(隐式终止)。
    • 调用 pthread_exit(void *retval)
    • 被其他线程取消(pthread_cancel)。
  • 等待线程结束

    int pthread_join(pthread_t thread, void **retval);
    
  • 分离线程(避免资源泄漏): c pthread_detach(pthread_t thread);

4. 线程同步机制

互斥锁(Mutex)

  • 初始化/销毁c pthread_mutex_init(&mutex, NULL); pthread_mutex_destroy(&mutex);
  • 加锁/解锁c pthread_mutex_lock(&mutex); // 阻塞 pthread_mutex_trylock(&mutex); // 非阻塞 pthread_mutex_unlock(&mutex);

条件变量(Condition Variable)

  • 用于线程间事件通知: c pthread_cond_wait(&cond, &mutex); // 等待条件(自动释放锁) pthread_cond_signal(&cond); // 唤醒一个等待线程 pthread_cond_broadcast(&cond); // 唤醒所有等待线程

读写锁(Read-Write Lock)

  • 允许多读单写: c pthread_rwlock_rdlock(&rwlock); // 读锁 pthread_rwlock_wrlock(&rwlock); // 写锁

自旋锁(Spinlock)

  • 忙等待锁,适用于短临界区: c pthread_spin_lock(&spinlock);

屏障(Barrier)

  • 同步多个线程到达某一点: c pthread_barrier_wait(&barrier);

5. 线程安全与可重入函数

  • 线程安全函数:可被多线程同时调用(如使用互斥锁保护)。
  • 可重入函数:不依赖静态数据或全局变量(如 strtok_rstrtok 的可重入版本)。

6. 线程局部存储(TLS)

  • 每个线程独享的变量: c __thread int tls_var; // GCC扩展 或 pthread_key_create(&key, destructor); pthread_setspecific(key, value);

7. 线程取消(Cancellation)

  • 取消点:系统调用(如 sleep)、手动设置 pthread_testcancel()
  • 取消类型
    • 延迟取消(默认,仅在取消点响应)。
    • 异步取消(立即终止,危险)。

8. 线程属性

  • 设置栈大小、分离状态等: c pthread_attr_init(&attr); pthread_attr_setstacksize(&attr, 1024*1024); // 1MB栈 pthread_create(&thread, &attr, func, NULL);

9. 信号处理

  • 多线程中信号由进程共享,建议:
    • 主线程统一处理信号(pthread_sigmask 屏蔽其他线程)。
    • 使用 sigwait 同步处理信号。

10. 常见问题与调试

  • 竞态条件:未同步访问共享资源。
  • 死锁:互斥锁嵌套、循环等待。
  • 工具
    • valgrind --tool=helgrind 检测数据竞争。
    • gdb 调试多线程(info threadsthread <id>)。

11. 现代替代方案

  • C++标准库std::threadstd::mutex(需C++11及以上)。
  • 协程(Coroutine):轻量级用户态线程(如libco、Boost.Coroutine)。

示例:生产者-消费者模型

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
Queue queue;

void* producer(void* arg) {
    while (1) {
        pthread_mutex_lock(&mutex);
        queue.push(item);
        pthread_cond_signal(&cond);
        pthread_mutex_unlock(&mutex);
    }
}

void* consumer(void* arg) {
    while (1) {
        pthread_mutex_lock(&mutex);
        while (queue.empty()) {
            pthread_cond_wait(&cond, &mutex);
        }
        Item item = queue.pop();
        pthread_mutex_unlock(&mutex);
        process(item);
    }
}

掌握这些知识点后,可以进一步学习线程池设计、无锁编程(如原子操作)、多核并行优化(OpenMP)等高级主题。