🌨️线程
00 min
2024-12-11
2025-1-8
type
status
summary
date
slug
tags
category
icon
password
在 Linux 中,线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。线程可以与同属一个进程的其他线程共享进程资源,如内存空间、文件描述符等,但每个线程也有自己的程序计数器、寄存器和栈空间,以便独立执行任务。

线程的概念

  • 轻量级:线程是轻量级的进程,创建和切换线程的开销比进程小。这是因为线程共享进程的大部分资源,不需要像进程那样分配独立的资源。
  • 并发执行:线程可以与其他线程并发执行,提高程序的执行效率。例如,在多线程服务器中,可以为每个客户端请求创建一个线程来处理,从而实现同时处理多个请求。
  • 共享资源:同一进程内的线程可以共享进程的全局变量、文件描述符、内存空间等资源。这使得线程间的通信和数据共享更加方便,但也需要注意同步和互斥问题,以避免资源冲突和数据不一致。

线程与进程的区别

  • 资源拥有
    • 进程:拥有独立的资源集合,包括内存空间、文件描述符、全局变量等。进程间的资源是隔离的,不能直接共享。
    • 线程:共享所属进程的大部分资源,如内存空间和文件描述符等,但每个线程有自己的程序计数器、寄存器和栈空间。
  • 创建和销毁
    • 进程:创建和销毁进程的开销较大,需要分配和回收独立的资源。
    • 线程:创建和销毁线程的开销较小,只需分配少量的资源,如栈空间等。
  • 通信方式
    • 进程:进程间的通信需要通过进程间通信机制,如管道、信号、消息队列、共享内存等,实现起来相对复杂。
    • 线程:线程间的通信可以通过直接访问共享资源来实现,如共享内存和全局变量等,通信更加方便和高效,但也需要注意同步和互斥问题。
  • 调度单位
    • 进程:操作系统调度的基本单位是进程,进程的切换开销较大。
    • 线程:线程是操作系统调度的基本单位,线程的切换开销较小,可以更细粒度地进行调度,提高系统的并发性能。
  • 独立性
    • 进程:进程是独立的运行单位,拥有独立的地址空间和资源,一个进程崩溃不会影响其他进程。
    • 线程:线程是依赖于进程的,一个进程崩溃可能会导致其所有线程崩溃,因为线程共享进程的资源和地址空间。

线程的应用场景

  • 多任务处理:如多线程服务器,可以同时处理多个客户端请求。
  • 提高程序效率:通过并发执行多个线程,可以充分利用多核 CPU 的计算能力,提高程序的执行效率。
  • 响应式程序:如图形用户界面程序,可以使用一个线程处理用户界面,另一个线程处理后台任务,使程序更加响应用户操作。
总之,线程是进程中的实际运作单位,具有轻量级、共享资源和并发执行的特点,与进程相比,在资源拥有、创建和销毁、通信方式、调度单位和独立性等方面存在显著区别。合理使用线程可以提高程序的效率和响应性,但也需要注意线程间的同步和互斥问题,以避免资源冲突和数据不一致。
 
 

线程控制

在 Linux 中,线程的控制、创建、终止和等待是多线程编程中的基本操作。以下是这些操作的详细介绍:

线程控制

线程控制是指对线程的运行状态进行管理和控制,包括线程的创建、执行、暂停、恢复和终止等操作。线程控制通常通过线程库(如 POSIX 线程库 pthreads)提供的函数来实现。

线程创建

在 Linux 中,可以使用 pthread_create 函数来创建一个新线程。该函数的基本语法如下:
  • 参数说明
    • thread:指向 pthread_t 类型变量的指针,用于存储新创建线程的线程 ID。
    • attr:指向 pthread_attr_t 类型的指针,用于设置线程属性(如栈大小、调度策略等)。如果设置为 NULL,则使用默认属性。
    • start_routine:新线程的入口函数,类型为 void* (*)(void*)。该函数将在线程启动后执行。
    • arg:传递给 start_routine 函数的参数,类型为 void*
  • 返回值:如果创建成功,返回 0;否则返回错误码。

线程终止

线程的终止可以通过以下几种方式实现:
  • 自然终止:线程执行完其入口函数后自然终止。
  • 显式终止:线程可以通过调用 pthread_exit 函数显式终止自己。该函数的基本语法如下:
    • retval:线程退出时返回的值,可以被其他等待该线程的线程获取。
  • 被其他线程取消:一个线程可以通过调用 pthread_cancel 函数请求取消另一个线程。被取消的线程在执行到取消点时会终止。

线程等待

线程等待是指一个线程等待另一个线程完成其执行。在 Linux 中,可以使用 pthread_join 函数来实现线程等待。该函数的基本语法如下:
  • 参数说明
    • thread:要等待的线程的线程 ID。
    • retval:指向 void* 类型变量的指针,用于存储被等待线程的返回值。如果不需要获取返回值,可以设置为 NULL
  • 返回值:如果等待成功,返回 0;否则返回错误码。

示例代码

以下是一个简单的示例,演示了线程的创建、终止和等待:

注意事项

  • 线程同步:在多线程程序中,需要使用互斥锁、条件变量等同步机制来避免线程间的竞态条件和死锁问题。
  • 资源清理:线程终止时,需要确保其占用的资源(如内存、文件描述符等)得到正确释放,以避免资源泄露。
  • 取消点:线程取消操作只在取消点处生效,取消点是一些系统调用和库函数,如 readwritepthread_testcancel 等。
通过合理使用线程控制、创建、终止和等待等操作,可以有效地管理和协调多线程程序的执行,提高程序的并发性能和响应性。
上一篇
编译过程
下一篇
vue