Linux —— 线程
发布日期:2025-04-06 08:09:16 浏览次数:7 分类:精选文章

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

Linux 线程概述

今天,我们来探讨线程的概念及其在操作系统中的实现。

线程的概念

线程是操作系统能够进行运算调度的最小单位。相较于传统的进程,线程在资源使用上更为高效。通过线程的多任务并行执行,程序能够在单一处理器核心上实现多线程并发,此外,还能充分利用多核处理器的资源。

进程与线程的关系

一个进程可以包含多个线程,这些线程共享进程的地址空间、文件句柄等资源。然而,每个线程都拥有一套独立的执行环境,包括程序计数器、栈空间(调用栈)和寄存器等。线程的共享性质使得其在资源复用方面优于进程。

Linux 线程实现

Linux 的线程实现方式具有独特之处。它并非直接使用专门的线程概念,而是将线程看作轻量级进程(Lightweight Processes, LWP)。在内核中,线程与普通进程无异,都以 task_struct 结构体进行表示。线程通过 clone() 系统调用创建,这使得线程与进程具有共同的基础设施。

Windows 线程实现

Windows 则采用了完全不同的线程模型。操作系统对线程的支持更为深入,通过特定的 API 提供线程的创建、管理和调度。例如,CreateThread 和 SetThreadPriority 等函数为开发者提供了强大的控制能力。此外,Windows 还支持多线程环境下的资源管理,如线程局部存储和互斥机制。

线程的使用实例

我们可以通过简单的示例来理解线程的概念。以下是一个使用 pthread_create 函数创建线程的示例:

#include 
#include
#include
void *ThreadRoutine(void *arg) { const char *thread_name = (const char *)arg; while (true) { std::cout << "I am a thread process, pid: " << getpid() << std::endl; sleep(1); }}int main() { pthread_t tid; pthread_create(&tid, nullptr, ThreadRoutine, (void *)"thread 1"); while (true) { std::cout << "I am the main thread, pid: " << getpid() << std::endl; sleep(1); } return 0;}

此程序创建一个子线程,并在子线程和父线程中打印 PID。子线程会在每个循环中输出 "I am a thread process",而主线程则输出 "I am the main thread"。

并发写入问题及解决方案

在上述示例中,多个线程同时向标准输出(stdout)写入内容可能导致输出混乱。这是因为 std::cout 的输出操作在��态原子性下进行,容易被其他线程中断。为解决这一问题,可以使用互斥锁机制:

#include 
#include
#include
#include
std::mutex cout_mutex;void *ThreadRoutine(void *arg) { const char *thread_name = (const char *)arg; while (true) { { std::unique_lock
lock(cout_mutex); std::cout << "I am a thread process, pid: " << getpid() << std::endl; } sleep(1); }}int main() { pthread_t tid; pthread_create(&tid, nullptr, ThreadRoutine, (void *)"thread 1"); while (true) { { std::unique_lock
lock(cout_mutex); std::cout << "I am the main thread, pid: " << getpid() << std::endl; } sleep(1); } return 0;}

通过使用互斥锁,我们可以确保同时访问标准输出的唯一性,从而避免输出混乱。

查看线程

在查看线程时,可以使用以下命令:

ps -aL

这将显示所有的进程(LWP),包括线程。例如,输出可能如下:

USER       PID   TTY          VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMANDroot     13091   管道      41680  5056   44   0  0.0%  3.1%  0:00.44 root    13902 13901      9968   80     8   0  0.0%  0.8%  0:00.90 thread 1...

容器中的每个 LWP 都是一个线程,其父进程为 13901。

线程的轻量性

线程由于共享资源和占用的空间相对较少,在多核处理器环境中表现尤为出色。以下是线程的主要优势:

  • 资源复用:线程共享地址空间、文件描述符等资源,节省内存占用。
  • 上下文切换:线程切换时只需保存和恢复寄存器等少量状态信息,与进程相比效率更高。
  • 创建销毁:线程创建和销毁的代价低于进程。
  • 通信效率:线程间通信通过共享内存进行,速度更快。
  • 调度效率:线程调度通常由轻量化的机制完成,减少了调度开销。
  • 通过以上特点,线程成为实现并发执行和提升程序效率的重要工具。

    上一篇:Linux —— 线程互斥
    下一篇:Linux —— 生产者消费者模型

    发表评论

    最新留言

    表示我来过!
    [***.240.166.169]2025年04月22日 15时28分11秒