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

Linux软件编程(六)(exec 函数族、system 实现、进程回收与线程通信)

一、线程回收策略

在 Linux 中,线程创建后,结束时需要被回收,否则会变成“僵尸线程”,占用系统资源。

1.1 分离属性的线程

  • 定义:不需要被其他线程回收的线程,称为分离属性线程。

  • 特点:线程退出后由系统自动回收,不会变成僵尸线程。

  • 设置方法

#include <pthread.h>

int pthread_detach(pthread_t thread);

  • 示例

pthread_t tid; pthread_create(&tid, NULL, thread_func, NULL); pthread_detach(tid); // 设置为分离属性


1.2 非分离属性的线程(默认属性)

  • 定义:需要被其他线程回收的线程(默认属性)。

  • 特点:线程结束后不会立即释放资源,必须调用 pthread_join() 回收。

  • 使用方法

pthread_t tid;

pthread_create(&tid, NULL, thread_func, NULL);

pthread_join(tid, NULL); // 阻塞等待,回收线程资源


1.3 注意事项

  • 分离属性线程:不用 pthread_join(),由系统自动回收。

  • 非分离属性线程:必须调用 pthread_join(),否则会变成僵尸线程。


二、线程间通信

多线程之间需要共享数据时,常见方式是 全局变量
但多个线程同时访问共享变量时会导致 资源竞争,需要使用 互斥机制


2.1 临界资源

  • 定义:多个线程可能同时访问的共享资源。

  • 例子:全局变量、共享内存等。


2.2 互斥锁(mutex)

  • 作用:保证任意时刻只有一个线程能访问临界资源。

相关函数

pthread_mutex_t mutex; // 定义互斥锁

int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr); // 初始化

int pthread_mutex_lock(pthread_mutex_t *mutex); // 加锁 int pthread_mutex_unlock(pthread_mutex_t *mutex); // 解锁 int pthread_mutex_destroy(pthread_mutex_t *mutex);// 销毁

  • attr:一般填 NULL,使用默认属性。

  • 加锁和解锁必须成对出现


2.3 示例代码

#include <stdio.h>

#include <pthread.h>

#include <unistd.h>

int counter = 0; // 全局变量(临界资源)

pthread_mutex_t mutex; // 定义互斥锁

void *thread_func(void *arg)

{

    for (int i = 0; i < 5; i++)

    {

        pthread_mutex_lock(&mutex); // 加锁

        counter++;

        printf("Thread %ld: counter = %d\n", pthread_self(), counter);            pthread_mutex_unlock(&mutex); // 解锁

        sleep(1);

    }

    return NULL;

int main()

{

    pthread_t t1, t2;

    pthread_mutex_init(&mutex, NULL); // 初始化互斥锁

    pthread_create(&t1, NULL, thread_func, NULL);

    pthread_create(&t2, NULL, thread_func, NULL);

    pthread_join(t1, NULL); // 回收线程

    pthread_join(t2, NULL); pthread_mutex_destroy(&mutex); // 销毁锁

    return 0;

}


三、总结

  • 线程回收

    • 分离属性线程:pthread_detach(),系统自动回收。

    • 非分离属性线程:默认,需要 pthread_join() 回收,否则会变僵尸线程。

  • 线程通信

    • 使用互斥锁 pthread_mutex_t 保护临界资源。

    • pthread_mutex_lock()pthread_mutex_unlock() 必须成对出现。

    • 最后记得 pthread_mutex_destroy()

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

相关文章:

  • C++ 内存管理(内存分布 , 管理方式 , new和delete实现原理)
  • pidgen!DecodeProdKey函数分析之iDecodedBytesMax
  • 服务器硬件电路设计之I2C问答(七):解析 I2C 通信 “卡壳” 难题:从设备无响应与跨电压兼容之道
  • Spring AI Starter和文档解读
  • InfluxDB 数据迁移工具:跨数据库同步方案(一)
  • 超酷炫的Three.js示例
  • Java:File类、递归、字符集、IO流体系及Commons-io框架
  • 【大模型核心技术】Dify 入门教程
  • Flow-GRPO:通过在线 RL 训练 Flow matching 模型
  • PS插件整合包!内置数百款PS插件,支持PS2017-PS2025所有版本!
  • 【学习嵌入式day-26-线程间通信】
  • TypeScript快速入门
  • CPP多线程3:async和future、promise
  • ArrayList的contains问题
  • 机器学习 [白板推导](十二)[卡曼滤波、粒子滤波]
  • 第G7周:Semi-Supervised GAN 理论与实战
  • 【科研绘图系列】R语言绘制雷达图
  • 洛谷B3865 [GESP202309 二级] 小杨的 X 字矩阵(举一反三)
  • 从 MySQL 5.7 迁移到 8.0:别让 SQL 文件 “坑” 了你
  • 《从入门到高可用:2025最新MySQL 8.0全栈速通指南》
  • Linux配置Dante使用的pam验证
  • 【攻防实战】红队攻防之Goby反杀
  • 力扣(LeetCode) ——622. 设计循环队列(C语言)
  • Android Jetpack | Lifecycle
  • 6JSON格式转python并实现数据可视化
  • 储能领域大数据平台的设计中如何使用 Hadoop、Spark、Flink 等组件实现数据采集、清洗、存储及实时 / 离线计算,支持储能系统分析与预测
  • 人工智能中的(特征选择)数据过滤方法和包裹方法
  • 2-3〔O҉S҉C҉P҉ ◈ 研记〕❘ 漏洞扫描▸AppScan(WEB扫描)
  • KingbaseES主备读写分离集群安装教程
  • 计算机网络:(十五)TCP拥塞控制与拥塞控制算法深度剖析