博客
关于我
Linux —— 线程控制
阅读量:792 次
发布时间:2023-02-01

本文共 1837 字,大约阅读时间需要 6 分钟。

Linux 线程控制是操作系统管理的一大课题,被广泛应用于提高程序效率和响应速度。本章将深入探讨线程的创建、监视、优缺点以及线程与进程的关系。

1. 创建多个线程

在 Linux 中,线程的创建可通过 pthread_create 函数实现。以下是创建多个线程的关键步骤:

1.1 函数包装器定义

可以使用 std::function 作为函数包装器类型别名:

using func_t = std::function
;

1.2 结构体定义

定义一个结构体保存线程的相关信息,如名称、创建时间和执行函数:

class ThreadData {public: ThreadData(const std::string &name, const uint64_t &ctime, func_t f)  : thread_name(name), create_time(ctime), func(f) {} std::string thread_name; uint64_t create_time; func_t func;};

1.3 线程处理函数

定义一个函数处理线程:

void *Threadhandler(void *args) { int a = 10; ThreadData *td = static_cast
(args); std::cout << "new thread, name: " << td->thread_name << " create time: " << td->create_time << std::endl; td->func(); sleep(1); return nullptr;}

1.4 主函数

main 中循环创建指定数量的线程,存入向量:

int main() { std::vector
################################################################################ // ... loader 超出此处显示范围}

每个线程在创建后,主线程休息一秒,模拟线程间的间隔。

2. 监视线程

使用命令行工具监控线程状态:

while get; do ps -aL | head -1 && ps -aL | grep process; sleep 1; done

这个命令会持续显示当前系统的进程列表。

3. 线程的优缺点

  • 优点

    • 提高资源利用率:线程共享内存和资源,减少上下文切换消耗。
    • 响应速度快:多任务同时处理,提升了用户体验。
    • 编程简化:适合复杂并发任务,简化了编程模型。
  • 缺点

    • 资源共享问题:竞态条件、死锁等问题需额外同步。
    • 上下文切换开销:频繁切换增加系统开销。
    • 内存占用:大量线程占用加内存,尤其是内存有限的环境。
    • 健壮性不佳:线程死亡会导致故障,需要正确设计和测试。

4. 线程退出和回收

线程退出需通过 pthread_exit 或返回 void,而主线程可以使用 pthread_join 回收子线程。但为了优雅地终止线程,可以使用 pthread_detach Athletic Prime 线程自行回收资源。

5. 返回线程退出信息

通过结构体接收线程退出时的信息,如名称和退出码,可以更好地管理资源释放。

6. 线程取消

使用 pthread_cancel 可以向线程发送取消请求,提升程序的灵活性和响应性。需注意取消点的设置和资源管理。

7.(pthread_t) 理解

pthread_t 是线程 ID,每个线程拥有一个独特的结构体地址。理解这个地址可以帮助管理和追踪进程资源。

8. 线程的创建步骤总结

  • 包含所需头文件。
  • 定义函数包装器类型别名。
  • 创建结构体存储线程信息。
  • 定义线程处理函数,打印线程信息并执行函数体。
  • main 中循环创建线程,管理和等待线程。
  • 9. 线程的优化建议

    • 合理同步:使用互斥锁、信号量等确保数据一致性。
    • 相互独立:避免在共享资源上同时访问,以减少竞争条件。
    • 错误处理:确保线程安全,防止未捕获的异常导致进程失败。
    • 资源管理:正确释放资源,避免资源泄漏。

    线程技术在现代操作系统中扮演着关键角色,但其复杂性要求开发者具备较高的技能。合理使用线程可以充分发挥资源潜力,提升程序性能和用户体验。

    转载地址:http://ypwfk.baihongyu.com/

    你可能感兴趣的文章
    leetcode题解20-有效的括号
    查看>>
    leetcode题解200-岛屿数量
    查看>>
    leetcode题解206-反转链表
    查看>>
    leetcode题解279-完全平方数
    查看>>
    leetcode题解34-在排序数组中查找元素的第一个和最后一个位置
    查看>>
    leetcode题解347-前 K 个高频元素
    查看>>
    leetcode题解434-字符串中的单词数(双指针经典)
    查看>>
    leetcode题解46-全排列
    查看>>
    leetcode题解48-旋转图像
    查看>>
    leetcode题解53-最大子序和
    查看>>
    leetcode题解56-合并区间
    查看>>
    leetcode题解66-加一
    查看>>
    leetcode题解70-爬楼梯
    查看>>
    leetcode题解72-编辑距离
    查看>>
    leetcode题解75-颜色分类
    查看>>
    leetcode题解767-重构字符串
    查看>>
    leetcode题解77-子集
    查看>>
    leetcode题解77-组合
    查看>>
    leetcode题解8-盛最多水的容器
    查看>>
    leetcode题解976-三角形的最大周长
    查看>>