Linux -- 线程

线程

线程基本概念

线程 :操作系统调度的最小单位,是进程内的一条执行路径。

  • 一个进程可包含多个线程

  • 同一进程内线程共享资源:地址空间、全局变量、堆、文件描述符

  • 每个线程独有:栈、程序计数器、寄存器、上下文

线程核心特点

  1. 轻量级:创建 / 销毁 / 切换开销远小于进程

  2. 资源共享:线程间直接访问共享数据,通信极快

  3. 独立调度:可在多核 CPU 上真正并行

  4. 稳定性弱:一个线程崩溃 → 整个进程崩溃

进程 vs 线程(⭐)

对比项 进程 线程
资源 独立地址空间、独立资源 共享进程地址空间与资源
开销 创建 / 切换 / 销毁开销大 轻量,开销小
通信 管道 / 共享内存 / 消息队列等 直接读写共享变量
稳定性 进程间独立,互不影响 一个线程崩溃 → 进程崩溃
调度单位 以进程为单位 以线程为单位

线程核心 API

头文件:

复制代码
#include <pthread.h>

编译必须加:-lpthread

复制代码
gcc 1.c -o 1 -lpthread
1. 创建线程
复制代码
int pthread_create(
    pthread_t *thread,        // 输出:线程ID
    const pthread_attr_t *attr, // 线程属性,填NULL
    void *(*start_routine)(void*), // 线程入口函数
    void *arg                 // 传给线程的参数
);
  • 返回值:成功 = 0,失败 = 非 0
2. 等待线程结束(阻塞)
复制代码
int pthread_join(
    pthread_t thread,   // 要等待的线程ID
    void **retval       // 接收线程返回值
);
  • 作用:主线程阻塞,等待子线程结束再继续
3. 线程退出
复制代码
void pthread_exit(void *retval);
  • retval:线程返回值(必须是全局 / 堆内存,不能是局部变量)
线程生命周期(⭐)
  • 主线程如果不调用 pthread_join 就先退出,会导致整个进程终止,子线程被强制杀死。

  • 正确流程:

    复制代码
    主线程创建子线程 → pthread_join 等待 → 主线程再退出

经典示例:线程计算 1~10 累加

复制代码
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
​
int num = 0; // 全局变量,线程间共享
​
void* fun(void* arg) {
    for (int i = 0; i <= 10; i++) {
        num += i;
    }
    pthread_exit(&num); // 返回全局变量地址
}
​
int main() {
    pthread_t id;
    pthread_create(&id, NULL, fun, NULL);
​
    printf("main running...\n");
​
    int* s = NULL;
    pthread_join(id, (void**)&s); // 等待线程结束并接收返回值
​
    printf("result = %d\n", *s); // 输出 55
    return 0;
}
  • 进程 = 资源容器

  • 线程 = 执行单元

  • 线程更轻、更快、共享资源,但稳定性更弱,需同步控制。

相关推荐
木棉软糖8 分钟前
JDBC 读 ResultSet 读到一半,报 stream closed
java·mysql·spring
Logic1019 分钟前
C语言/数据结构贡献法题解:数组权值——所有连续子数组中不同数字个数之和(O(n)解法)
c语言·数据结构·算法·数组·时间复杂度·贡献法·哈希记录
DongQiShanRen9 分钟前
六根硬件映射(中):双站校验、生克闭环与驱动接口
数据库·人工智能·算法·rust·哈希算法·集成学习
狂奔的sherry13 分钟前
JRuby 多线程反引号偶发 127:GC 提前释放了 posix_spawn 的 argv
java·linux·ruby·gc·jruby
咖啡八杯16 分钟前
异常体系设计:三类策略(i18n code、message、受检异常)
java·架构·代码规范
mmmmath_323 分钟前
LeetCode.637.二叉树的层平均值
算法·leetcode
青少儿编程课堂30 分钟前
蓝桥杯·全国青少年信息素养大赛·电子学会C/C++考级:并查集连通块与朋友圈问题解析
c++·python·算法·bfs·信息学竞赛
Spatial3Ddddd30 分钟前
2026空间三维重建服务商横向对比
java·服务器·人工智能
Tisfy36 分钟前
LeetCode 2913.子数组不同元素数目的平方和 I:第一题先常数很大的O(n^2)
算法·leetcode·题解·模拟·暴力
罗湖老棍子41 分钟前
[USACO05NOV] Asteroids G(洛谷-P7368)
算法·图论·二分图匹配·最大匹配·最小顶点覆盖