下面是《Linux 多线程入门:初识线程》教程内容,适用于刚接触 Linux 下多线程编程的开发者。


Linux 多线程:初识线程


📚 目录

  1. 什么是线程?
  2. 线程与进程的区别
  3. Linux 中的线程支持
  4. POSIX 线程库(pthread)
  5. 创建线程的基本方法
  6. 示例代码讲解
  7. 线程退出与回收
  8. 多线程编程注意事项
  9. 常见面试题回顾
  10. 学习延伸与参考资料

1️⃣ 什么是线程?

线程(Thread)是程序执行的最小单位,是比进程更小的执行流。一个进程在执行过程中可以包含多个线程,这些线程共享进程的资源(如内存、文件描述符等),但每个线程拥有自己的栈空间、程序计数器(PC)和寄存器环境。


2️⃣ 线程与进程的区别

特性进程(Process)线程(Thread)
地址空间独立地址空间共享进程地址空间
通信方式需要 IPC(管道、消息队列等)直接读写共享内存
创建/销毁开销大,涉及系统资源小,开销轻
崩溃影响范围独立,不影响其他进程同进程下其他线程可能受影响

3️⃣ Linux 中的线程支持

Linux 并不将线程视为“特殊实体”,而是通过 轻量级进程(LWP) 实现线程。它们之间共享地址空间,但调度器仍将每个线程视为独立的任务。

内核通过 clone() 系统调用创建线程,用户空间通过 pthread(POSIX Threads)接口操作。


4️⃣ POSIX 线程库(pthread)

在 Linux 中,我们使用 pthread(POSIX Threads) 接口编写多线程程序。该库提供线程的创建、同步、终止等一整套接口,使用广泛,几乎所有 Linux 系统默认支持。

编译时需加上 -pthread 参数:

gcc thread.c -o thread -pthread

5️⃣ 创建线程的基本方法

函数原型:

#include <pthread.h>

int pthread_create(pthread_t *thread,
                   const pthread_attr_t *attr,
                   void *(*start_routine) (void *),
                   void *arg);

参数说明:

  • thread: 返回线程 ID
  • attr: 线程属性,传 NULL 使用默认
  • start_routine: 线程入口函数
  • arg: 传给线程函数的参数

6️⃣ 示例代码讲解

#include <pthread.h>
#include <stdio.h>
#include <unistd.h>

void* thread_func(void* arg) {
    printf("Hello from thread! Received: %s\n", (char*)arg);
    return NULL;
}

int main() {
    pthread_t tid;
    char* msg = "Thread argument";

    if (pthread_create(&tid, NULL, thread_func, msg) != 0) {
        perror("pthread_create failed");
        return 1;
    }

    pthread_join(tid, NULL); // 等待线程结束
    printf("Thread finished.\n");

    return 0;
}

编译运行:

gcc thread.c -o thread -pthread
./thread

7️⃣ 线程退出与回收

  • pthread_exit():线程主动退出
  • return:从线程函数返回值
  • pthread_join():主线程等待子线程结束
  • pthread_detach():将线程分离,线程结束时资源自动释放

注意: 不 join 又不 detach 的线程,会造成资源泄漏(类似“僵尸线程”)。


8️⃣ 多线程编程注意事项

  • ✅ 避免使用全局变量或保护它们(互斥锁)
  • ✅ 同一资源需加锁,防止数据竞争(data race)
  • ❌ 不要在线程退出后访问其栈变量
  • ❌ 不建议在线程函数中 exit(),这会终止整个进程

9️⃣ 常见面试题回顾

  1. pthread_create 和 fork() 有什么区别?
  2. 为什么线程比进程“轻”?
  3. 如何避免线程间共享变量的竞争?
  4. pthread_exit 与 return 有何不同?
  5. 线程池的核心原理是什么?

🔗 10. 学习延伸与参考资料(出站链接)


如果你想继续深入学习多线程内容,如线程同步(mutex、cond)、线程池实现、死锁问题、信号量等,请告诉我,我可以为你继续生成系列教程。