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

核心要点:线程

#include "head.h"int rfd, wfd;
long size;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; // 定义互斥锁void* first(void *arg)
{// 定位文件指针前加锁pthread_mutex_lock(&mutex);lseek(rfd, 0, SEEK_SET);lseek(wfd, 0, SEEK_SET);pthread_mutex_unlock(&mutex);char buf[4096]; // 使用缓冲区提高性能ssize_t bytes;for (long i = 0; i < size / 2; ){bytes = read(rfd, buf, sizeof(buf));if (bytes <= 0) break;write(wfd, buf, bytes);i += bytes;}printf("前半部分拷贝完毕.....");pthread_exit(NULL);
}void* last(void *arg)
{// 定位文件指针前加锁pthread_mutex_lock(&mutex);lseek(rfd, size / 2, SEEK_SET);lseek(wfd, size / 2, SEEK_SET);pthread_mutex_unlock(&mutex);char buf[4096];ssize_t bytes;for (long i = size / 2; i < size; ){bytes = read(rfd, buf, sizeof(buf));if (bytes <= 0) break;write(wfd, buf, bytes);i += bytes;}printf("后半部分拷贝完毕.....");pthread_exit(NULL);                                                  
}int main(int argc, const char *argv[])
{// 打开源文件和目标文件rfd = open("./xiaoxin.bmp", O_RDONLY);if (rfd < 0) {perror("open source file failed");exit(1);}wfd = open("./cp_xiaoxin.bmp", O_WRONLY | O_CREAT | O_TRUNC, 0664);if (wfd < 0) {perror("open target file failed");close(rfd);exit(1);}// 计算文件大小size = lseek(rfd, 0, SEEK_END);pthread_t tid1, tid2;// 创建线程并检查错误if (pthread_create(&tid1, NULL, first, NULL)){perror("create thread1 failed");close(rfd);close(wfd);exit(1);}if (pthread_create(&tid2, NULL, last, NULL)) {perror("create thread2 failed");close(rfd);close(wfd);exit(1);}// 等待线程结束pthread_join(tid1, NULL);pthread_join(tid2, NULL);// 销毁互斥锁(可选)pthread_mutex_destroy(&mutex);close(rfd);close(wfd);return 0;
}

核心要点:线程

一、线程基础
  1. 线程概念

    • 引入目的:减少进程切换的资源开销,提高效率。
    • 定义:线程是进程内任务执行的最小单位,共享进程资源(内存、文件等)。
    • 并发 vs 并行
      • 并发:单核 CPU 通过时间片轮询模拟“同时”执行多任务。
      • 并行:多核 CPU 真正同时执行多任务。
    • 上下文切换:CPU 在不同线程间切换时保存/恢复资源的过程。
  2. 线程 vs 进程(面试重点)

    • 资源:进程资源独立,线程共享进程资源。
    • 单位:进程是资源分配的最小单位,线程是执行的最小单位。
    • 稳定性:进程更稳定,线程更轻量但易出错。
    • 通信:线程直接共享数据(需同步),进程需 IPC 机制。

二、线程函数
  1. 创建线程:pthread_create

    • 功能:创建新线程。
    • 参数
      • thread:存储新线程 ID。
      • attr:线程属性(默认 NULL)。
      • start_routine:线程入口函数(void* func(void*))。
      • arg:传递给线程函数的参数。
    • 返回值:成功返回 0,失败返回错误码(如 EAGAINEINVAL)。
  2. 终止线程:pthread_exit

    • 功能:结束当前线程,可返回结果(void* retval)。
    • 注意:主线程终止会导致所有分支线程终止。
  3. 连接线程:pthread_join

    • 功能:阻塞等待指定线程结束,回收资源。
    • 参数
      • thread:目标线程 ID。
      • retval:接收线程返回值(二级指针)。
  4. 分离线程:pthread_detach

    • 功能:设置线程为分离态,资源由系统自动回收。
    • 注意:分离后无法使用 pthread_join
  5. 取消线程:pthread_cancel

    • 功能:发送取消请求。
    • 状态控制
      • pthread_setcancelstate:设置是否可取消(ENABLE/DISABLE)。
      • pthread_setcanceltype:设置取消类型(DEFERRED/ASYNCHRONOUS)。

三、同步与互斥
  1. 基本概念

    • 临界资源:多线程共享的变量/文件等。
    • 临界区:访问临界资源的代码段。
    • 互斥:保证同一时间仅一个线程访问临界资源(无序)。
    • 同步:在互斥基础上控制线程执行顺序。
  2. 互斥锁(pthread_mutex_t

    • 使用步骤
      1. 初始化pthread_mutex_init 或静态初始化 PTHREAD_MUTEX_INITIALIZER
      2. 加锁pthread_mutex_lock(阻塞)或 pthread_mutex_trylock(非阻塞)。
      3. 解锁pthread_mutex_unlock
      4. 销毁pthread_mutex_destroy
    • 死锁风险:未正确释放锁可能导致死锁。
  3. 信号量(sem_t)与条件变量(pthread_cond_t

    • 信号量:通过计数器控制资源访问数量。
    • 条件变量:用于线程间条件通知(需搭配互斥锁)。

四、实践示例
  1. 多线程文件拷贝

    • 目标:两个线程分别拷贝文件的前半部分和后半部分。
    • 关键函数lseek 定位文件偏移,read/write 读写数据。
    • 注意:需通过同步机制避免读写冲突(如互斥锁)。
  2. 银行存取款模拟

    • 场景:存款线程与取款线程操作全局变量 money
    • 实现:使用互斥锁保护 money 的读写操作。

五、作业与练习
  1. 思维导图:总结线程概念、函数、同步机制。
  2. 无 sleep 的多线程文件拷贝:通过同步机制(如条件变量)替代 sleep 控制线程执行顺序。

常见问题
  • 线程共享资源:全局变量、文件描述符等需同步保护。
  • 分离态 vs 结合态:分离态线程资源由系统回收,结合态需手动 pthread_join
  • 取消点printfsleep 等函数隐含取消点,可触发线程终止。

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

相关文章:

  • 解决MacOS端口被占用问题
  • 升级xcode15 报错Error (Xcode): Cycle inside Runner
  • Visual Studio 技能:调整软件界面布局
  • 区块链vs实体经济:一场金融、医疗、政务与物流的“效率革命”
  • C++——入门基础
  • 人工智能大语言模型与AI芯片新进展:技术演进与商业化路径
  • 防火墙拦截DNS请求-原理解析
  • 如何快速在idea中希望Spark程序
  • el-transfer穿梭框数据量过大的解决方案
  • Deepseek 生成新玩法:从文本到可下载 Word 文档?思路与实践
  • 【angular19】入门基础教程(二):组件的创建与使用
  • CSdiy java 05
  • Redo log,Undo log和binlog
  • 蚁群算法是一种模拟蚂蚁觅食行为的优化算法,适合用于解决旅行商问题(TSP)
  • TCP vs UDP:核心区别、握手过程与应用场景(附对比图)
  • 零成本AI抠图终极指南:蓝耘元生代AIDC OS+ComfyUI实现商业级效果
  • 呼叫中心系统:重塑企业沟通效率的核心引擎
  • 灾情分析报告数据集制作
  • 跟着文档学Vuex(一):什么是Vuex
  • WP记录。
  • 单元测试总结
  • Linux0.11引导启动程序:简略过程
  • 相机-IMU联合标定:相机标定
  • K8S ConfigMap 快速开始
  • spring cloud 服务注册与发现(Service registration and discovery)
  • SAP S/4HANA迁移现状与展望(2025)
  • 解锁服务器迁移的未来:《2025 服务器迁移效率白皮书》(附下载)
  • (一)Linux的历史与环境搭建
  • Hadoop伪分布式模式搭建全攻略:从环境配置到实战测试
  • WebRTC SDK是什么?