爆款云主机2核4G限时秒杀,88元/年起!
查看详情

活动

天翼云最新优惠活动,涵盖免费试用,产品折扣等,助您降本增效!
热门活动
  • 618智算钜惠季 爆款云主机2核4G限时秒杀,88元/年起!
  • 免费体验DeepSeek,上天翼云息壤 NEW 新老用户均可免费体验2500万Tokens,限时两周
  • 云上钜惠 HOT 爆款云主机全场特惠,更有万元锦鲤券等你来领!
  • 算力套餐 HOT 让算力触手可及
  • 天翼云脑AOne NEW 连接、保护、办公,All-in-One!
  • 中小企业应用上云专场 产品组合下单即享折上9折起,助力企业快速上云
  • 息壤高校钜惠活动 NEW 天翼云息壤杯高校AI大赛,数款产品享受线上订购超值特惠
  • 天翼云电脑专场 HOT 移动办公新选择,爆款4核8G畅享1年3.5折起,快来抢购!
  • 天翼云奖励推广计划 加入成为云推官,推荐新用户注册下单得现金奖励
免费活动
  • 免费试用中心 HOT 多款云产品免费试用,快来开启云上之旅
  • 天翼云用户体验官 NEW 您的洞察,重塑科技边界

智算服务

打造统一的产品能力,实现算网调度、训练推理、技术架构、资源管理一体化智算服务
智算云(DeepSeek专区)
科研助手
  • 算力商城
  • 应用商城
  • 开发机
  • 并行计算
算力互联调度平台
  • 应用市场
  • 算力市场
  • 算力调度推荐
一站式智算服务平台
  • 模型广场
  • 体验中心
  • 服务接入
智算一体机
  • 智算一体机
大模型
  • DeepSeek-R1-昇腾版(671B)
  • DeepSeek-R1-英伟达版(671B)
  • DeepSeek-V3-昇腾版(671B)
  • DeepSeek-R1-Distill-Llama-70B
  • DeepSeek-R1-Distill-Qwen-32B
  • Qwen2-72B-Instruct
  • StableDiffusion-V2.1
  • TeleChat-12B

应用商城

天翼云精选行业优秀合作伙伴及千余款商品,提供一站式云上应用服务
进入甄选商城进入云市场创新解决方案
办公协同
  • WPS云文档
  • 安全邮箱
  • EMM手机管家
  • 智能商业平台
财务管理
  • 工资条
  • 税务风控云
企业应用
  • 翼信息化运维服务
  • 翼视频云归档解决方案
工业能源
  • 智慧工厂_生产流程管理解决方案
  • 智慧工地
建站工具
  • SSL证书
  • 新域名服务
网络工具
  • 翼云加速
灾备迁移
  • 云管家2.0
  • 翼备份
资源管理
  • 全栈混合云敏捷版(软件)
  • 全栈混合云敏捷版(一体机)
行业应用
  • 翼电子教室
  • 翼智慧显示一体化解决方案

合作伙伴

天翼云携手合作伙伴,共创云上生态,合作共赢
天翼云生态合作中心
  • 天翼云生态合作中心
天翼云渠道合作伙伴
  • 天翼云代理渠道合作伙伴
天翼云服务合作伙伴
  • 天翼云集成商交付能力认证
天翼云应用合作伙伴
  • 天翼云云市场合作伙伴
  • 天翼云甄选商城合作伙伴
天翼云技术合作伙伴
  • 天翼云OpenAPI中心
  • 天翼云EasyCoding平台
天翼云培训认证
  • 天翼云学堂
  • 天翼云市场商学院
天翼云合作计划
  • 云汇计划
天翼云东升计划
  • 适配中心
  • 东升计划
  • 适配互认证

开发者

开发者相关功能入口汇聚
技术社区
  • 专栏文章
  • 互动问答
  • 技术视频
资源与工具
  • OpenAPI中心
开放能力
  • EasyCoding敏捷开发平台
培训与认证
  • 天翼云学堂
  • 天翼云认证
魔乐社区
  • 魔乐社区

支持与服务

为您提供全方位支持与服务,全流程技术保障,助您轻松上云,安全无忧
文档与工具
  • 文档中心
  • 新手上云
  • 自助服务
  • OpenAPI中心
定价
  • 价格计算器
  • 定价策略
基础服务
  • 售前咨询
  • 在线支持
  • 在线支持
  • 工单服务
  • 建议与反馈
  • 用户体验官
  • 服务保障
  • 客户公告
  • 会员中心
增值服务
  • 红心服务
  • 首保服务
  • 客户支持计划
  • 专家技术服务
  • 备案管家

了解天翼云

天翼云秉承央企使命,致力于成为数字经济主力军,投身科技强国伟大事业,为用户提供安全、普惠云服务
品牌介绍
  • 关于天翼云
  • 智算云
  • 天翼云4.0
  • 新闻资讯
  • 天翼云APP
基础设施
  • 全球基础设施
  • 信任中心
最佳实践
  • 精选案例
  • 超级探访
  • 云杂志
  • 分析师和白皮书
  • 天翼云·创新直播间
市场活动
  • 2025智能云生态大会
  • 2024智算云生态大会
  • 2023云生态大会
  • 2022云生态大会
  • 天翼云中国行
天翼云
  • 活动
  • 智算服务
  • 产品
  • 解决方案
  • 应用商城
  • 合作伙伴
  • 开发者
  • 支持与服务
  • 了解天翼云
      • 文档
      • 控制中心
      • 备案
      • 管理中心

      Linux线程控制

      首页 知识中心 软件开发 文章详情页

      Linux线程控制

      2024-10-21 09:46:15 阅读次数:26

      pthread,线程,进程

      线程概念

      操作系统中的线程

      线程(thread)是进程内部的一个执行序列。可以将线程理解为进程的进一步细分,一个进程至少有一个执行流,这也是之前所讨论的单线程进程。将进程进一步细分的原因有很多,一方面,每个线程都可以看作一个独立的执行流,并且这些执行流是共享进程中的相当一部分资源的,即一个进程中的所有线程都可以天然进行通信,这是单纯的多进程所不具备的;另一方面,线程更加轻量级,创建、回收和调度一个线程的成本比进程低得多,同时,在多CPU的机器中,多线程使真正的程序并发变得可能。

      Linux中的线程

      须知,任何执行流要执行,都必须要有自己的资源,诸如代码和数据,线程也不例外。线程是进程的细分,线程在进程的地址空间内运行,线程的资源来自进程。透过进程地址空间可以看到进程的大部分资源,将进程资源合理地分配给线程,就形成了线程执行流。可以说,一个进程的所有线程是划分与共享进程地址空间中的资源的,对于单线程的进程来说也不例外,无非是只有一个主线程占有所有的进程资源。当创建一个线程时,操作系统不会给这个线程另外分配资源和时间片;同时,线程本身也是一个独立的调度实体,操作系统不会对进程和线程进行区分,而是将它们统一视为执行流进行调度。所以,线程是操作系统调度的基本单位,进程是操作系统分配资源的基本实体。线程本身是进程的一种资源,可以将一个进程看作所有线程 + 内核数据结构 + 所占有的系统资源。

      Linux线程控制

      线程是基本的调度单位,为了对系统中所有的线程进行管理,操作系统首先要对线程进行抽象描述,然后进一步对线程进行组织。考虑到线程与进程在行为与结构上的相似性,为了方便与轻量化,Linux内核中直接用进程相关的数据结构对线程进行了模拟,内核对线程的描述、组织方式与进程类似(这里须知,线程的出现相对于进程较晚)。这并不意味着Linux中没有线程,Linux具有明确的线程概念,只是复用了进程相关的内核结构对其进行描述和组织罢了。

      如上文所说,操作系统无法区分进程和线程,进程和线程对于操作系统来说都属于执行流,操作系统只认执行流,并对它们进行调度。由于Linux对线程实现的特殊性,Linux下的执行流也会被称为轻量级进程。Linux中对进程及其线程的组织关系大致如下:

      Linux线程控制

      进程与线程

      为了填补之前讨论进程与内存管理时留下的空缺,这里首先对页表结构进行讨论。页表是负责进程虚拟地址空间与物理内存空间进行转换的结构,虚拟地址空间中的虚拟地址通过页表和 MMU 映射到物理内存,实现了进程管理与内存管理的解耦。

      在32位机器下,具有 32 位虚拟地址,一共可以组成 232 个虚拟地址,虚拟地址空间大小为 4GB。为了将这些空间全部管理在内,Linux使用分级页表的方法,将32位虚拟地址进行分用,前10位分配给页目录,中间10位分配给页表项,最后12位留作具体定位用。页目录是一级页表,存储了页表项的索引,最多有1024个元素;页表项是二级页表,页表项存储物理内存中页框的地址,最多有1024个元素。通过页目录 + 页表项的映射,可以定位到物理内存中的某个页框,再通过页框地址 + 最后12位构成的[0, 4KB)偏移量,就可以定位到具体某个物理地址。

      Linux线程控制

      当要访问的地址在物理内存中不存在时,会触发缺页中断,cr2寄存器会保存引发中断的虚拟地址,当将代码/数据加载到内存、填充页表后,CPU会再次访问这个虚拟地址。

      对于某个数据类型,计算机只知道这个数据的首地址,而在实际编程中,计算机却能正确的将数据进行存储和取出,这是因为有数据类型的存在。数据类型本质是是一个偏移量,告诉计算机从数据的首地址向后取多少才能拿到这个完整的数据。可以认为,起始地址 + 数据类型 = 起始地址 + 偏移量。

      进程对线程进行资源分配,本质是分配自己的地址空间的范围。一个进程的代码和数据本身具有不同的虚拟地址,用户只需要让不同的线程访问不同的代码/数据,就实现了对线程的资源分配。注意用户只是控制线程访问不同的代码/数据而已,线程本身是都能看到其他线程的资源的。

      对进程与线程的效率问题的讨论是不可避免的。相较于进程,线程更加轻量化,这种轻量化主要表现在两个方面:

      • 线程占有的资源更少,创建和销毁更加轻量化。
      • 线程的切换更加轻量化。线程切换时不需要切换页表、地址空间等结构,并且线程切换时不需要重新加载进程的热数据。

      线程的轻量化是线程的优点之一。此外,对于IO密集型的应用,多线程可以重叠IO时间,同时等待不同的IO操作,在等待慢速IO时,其他线程可以同时进行计算操作。

      多线程还可能有很多不可忽略的问题。对于一个很少被外部阻塞的计算密集型程序,如果线程数量多于可用的处理器,往往会因为CPU对这些线程的同步和调度工作造成性能损失。多线程程序的健壮性难以得到保证,多线程在调度时间分配上产生偏差,或者共享了不恰当的资源而造成不良影响的可能性很大,线程之间是缺乏保护的。除此之外,编写和调试一个多线程程序往往比单线程较难。

      综上,合理利用多线程,对于CPU密集型的程序,可以提高执行效率,对于IO密集型的程序,可以提高响应速度,改善用户体验。

      Linux线程控制

      关于进程与线程的另一个话题是关于信号的。信号是进程层面的,当线程收到信号时,本质是进程收到了信号。当线程出现异常时,本质是进程出现了异常,如果没有自定义捕捉,则进程默认退出,所有线程也会退出。进程的pending表和handler表是所有线程共享的,当某个线程收到信号时,进程的pending表首先会记录这个信号,如果这个信号没有被阻塞,则handler表中对应的方法被执行。任何一个线程对handlber表的修改,其他线程也都要遵守。

      Linux线程控制

      上文一直在说,线程的大部分资源是共享自进程的,进程的所有线程共享进程的地址空间,所以进程的数据段、代码段和堆都是所有线程共享的,用户所定义的函数和全局变量,在所有线程中都是可见的。除此之外,线程还共享以下资源:

      • 文件描述符表 这意味着进程的文件资源是线程共享的。
      • handler表 进程对信号的处理方式是线程共享的。
      • 当前工作目录(cwd)

      线程共享进程地址空间,而线程是CPU调度的基本单位,仅仅有这些共享数据并不能保证和体现线程的独立性,每个线程也有一部分自己独立的数据:

      • CPU寄存器和线程栈 每个执行流的本质其实是一条调用链,而调用链本质是一个调用栈。线程的CPU寄存器是独立的,每个线程都有自己独立的上下文数据。CPU寄存器和线程栈的独立,表明线程的调度和运行是独立的。
      • errno C/C++中的errno保存了最近一次系统调用执行的错误码,在不同的线程中,可能执行不同的系统调用,线程的运行是独立的,为了保证彼此之间系统调用的错误码不相互干扰,变量errno也应是线程独立的。
      • 调度优先级 线程的调度和运行是独立的,每个线程都有自己独立的调度优先级。
      • 信号屏蔽字(block表) 每个线程都可以设置自己的信号屏蔽字,用于决定哪些信号可以被这个线程接收和处理(本质是进程接收和处理)。信号屏蔽字是线程独立的,每个线程都可以对自己接收到的信号做选择,类似于一个筛网,用于决定自己收到的哪些信号可以最终被进程处理。
      • 线程ID 线程ID唯一地标识了一个进程,线程ID是线程独立的。下文会看到,线程的 tid 本质是一个地址。

      线程控制

      pthread库

      在 Linux 中,POSIX pthread库是进行线程控制的原生方式。POSIX pthread库在所有类 unix 系统中适用。Linux中的线程是用进程进行模拟的,Linux 不会提供线程相关的系统调用接口,只提供轻量级进程(Light Weight Process)的系统调用接口,LWP是Linux执行流调度的基本单位,在纯系统角度,线程本质是一种轻量级进程。使用ps命令的-L选项查看当前系统中存在的轻量级进程,LWP是系统中轻量级进程的ID。

      [@shr Thu Mar 21 20:32:02 3.21_cpp_thread]$ ps -aL
        PID   LWP TTY          TIME CMD
      31398 31398 pts/0    00:00:00 a.out #主线程的LWP与进程PID相同
      31398 31399 pts/0    00:00:00 a.out
      31408 31408 pts/1    00:00:00 ps

      可以发现,主线程的 LWP与进程的PID相同。

      系统中提供的轻量级进程的相关接口的使用相对复杂。为了方便用户操作,POSIX提供了一个位于应用层的pthread第三方库,对这些复杂的接口进行了封装。几乎所有的类 unix 平台都自带pthread库。下面会以对线程的操作为主线对pthread提供的接口进行讨论。

      使用pthread_create(3)创建一个线程:

      #include <pthread.h>
      
      int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                        void *(*start_routine) (void *), void *arg);
      //成功返回0,失败返回错误码,并且thread不被定义
      • thread 是一个pthread_t类型的输出型参数,用于返回新建的线程的 tid。pthread_t 用于描述一个线程,在pthread库中,每个线程都有一个唯一的 pthread_t 类型的标识,这里将其称为 tid。tid 在 pthread 库中唯一的标识了一个线程。
      • attr 用于设置新建的线程的属性,一般设置为 nullptr,使用默认属性。
      • start_routine 指定线程的执行入口。线程的入口函数的参数和返回类型均要为void*。指定线程的入口,本质是在给线程分配代码资源。
      • arg 用来给线程入口函数start_routine传递参数,如果没有参数,则将其置为 nullptr。

      不考虑异常情况,线程退出一般有3种方式:

      主线程return,这时进程结束,所有线程退出。

      #include <pthread.h>
      
      void pthread_exit(void *retval);

      线程调用pthread_exit(3),调用者退出,退出状态可以设置为retval。

      #include <pthread.h>
      
      int pthread_cancel(pthread_t thread);
      //成功返回0,失败返回非0错误码

      线程调用pthread_cancel(3)使tid为 thread 的线程退出。当调用 pthread_cancel 时,系统会向指定线程发送一个取消请求,目标线程会在收到这个取消请求并处理后退出。

      当一个未被分离的线程退出时,会进入僵尸状态,造成与僵尸进程类似的问题。当 pthread_exit 与 pthread_cancel 使主线程退出时,其他线程可以继续运行,只有主线程僵尸。当其他线程退出时,主线程需要对其进行等待。

      #include <pthread.h>
      
      int pthread_join(pthread_t thread, void **retval);
      //成功返回0,失败返回错误码

      在主线程使用 pthread_join 等待指定线程退出,retval 是一个输出型参数,用于带出线程的返回码。所指定的线程 thread 必须是可连接的(joinable)。pthread_join默认进行的是阻塞等待。join可以回收退出线程的资源,获取线程的退出信息,并保证主线程最后退出。在等待时不考虑异常情况,因为异常是进程层面的,当发生异常时,整个进程默认都会退出。

      一个线程被创建时,默认是 joinable 可连接的,如果不想对线程进行等待,可以将这个线程进行分离(detach)。使用pthread_detach(3)分离一个线程。

      #include <pthread.h>
      
      int pthread_detach(pthread_t thread);
      //成功返回0,失败返回错误码

      线程被分离后处于detach状态,退出后会自动清理自己的资源。一个线程不能同时为joinable和detach,线程被分离后不能被等待,用户需要自己保证主线程最后退出以使程序正常运行和结束。线程是否被分离其实是线程的一种属性。将线程分离,只需要指定线程的tid即可,可以在指定线程中进行线程分离,也可以在其他线程中进行线程分离。使用pthread_self(3)获取当前线程的tid。

      #include <pthread.h>
      
      pthread_t pthread_self(void);
      //函数调用总是成功,返回当前线程的tid

      一个演示线程完整生命周期的demo程序大致如下:

      typedef void* T;
      
      uint64_t exitcode = 6;
      
      void *routine(T args)
      {
        uint64_t n = (uint64_t)args;
        for(uint64_t i = 1; i <= n; ++i) {
          cout << i << "> i am a thread, tid:" << pthread_self() << endl;
        }
        pthread_exit((T)exitcode);
      }
      
      int main()
      {
        pthread_t th;
        uint64_t n = 100;
        pthread_create(&th, nullptr, routine, (T)n);
        uint64_t retval = 0;
        pthread_join(th, (T*)&retval);
        printf("thread exit, code:%ld\n", retval);
        return 0;
      }

      线程tid与地址空间布局

      现在对pthread库与用户级线程、内核级线程做一深入讨论。动态库在运行时,一定要被加载到内存,并进一步被映射到地址空间中的共享区,pthread也不例外。同时,线程库是运行在操作系统之上的,是由用户进行维护的。上文说到,线程库是对轻量级进程相关系统调用的封装,他们两者的关系为:线程库是上层的,维护的是线程概念(属性),不维护线程执行流,线程执行流本质是一个轻量级进程,是由操作系统维护的。使用pthread库创建线程,创建的是内核级线程(lwp),pthread库对lwp的属性和接口在用户层面进行封装,使用户对这些lwp的操作更加方便。在Linux中,用户级线程与内核中的lwp数量是一一对应的。

      线程库要对多个线程进行管理,首先要对线程进行抽象描述,类似进程控制快,线程的**tcb**包含了线程的各个属性字段,线程库只需要以某种数据结构对tcb进行管理即可。每一个库级别的线程tcb的首地址,即是线程的tid,即tid的本质是一个地址。进行线程操作时,只要拿到tid,即线程tcb的首地址,既可以整个对tcb进行修改。tid是用户层面的,除了主线程,其他所有用户的所有线程都在pthread中被维护。

      Linux线程控制

      承上,下面要讨论线程tcb中包含的两个关键部分:线程局部存储和线程栈。

      进程的数据段是所有线程共享的,对于一个全局变量,任何一个线程对其的修改都是统一的。如果要定义一个变量,这个变量对所有线程都是可见的,但是每个线程对其的修改都是独立的,线程的局部存储技术可以做到这一点。使用gcc的扩展关键字__thread定义线程局部存储变量,本质是将这个变量放到了线程tcb中的线程局部存储空间,相当于定义了一个线程级别的全局变量。局部存储只能定义C/C++的内置类型。

      //***
      //普通全局变量
      //int n = 0;
      //***
      __thread int n = 0;
      int cnt = 10;
      
      void* routine_1(T args)
      {
        for(int i = 0; i < cnt; ++i) {
          cout << "i am th1, tid:" << pthread_self() << ", cur num: " << n++ << endl;
        }
      }
      
      void* routine_2(T args)
      {
        for(int i = 0; i < cnt; ++i) {
          cout << "i am th2, tid:" << pthread_self() << ", cur num: " << n++ << endl;
        }
      }
      
      int main()
      {
        pthread_t th1;
        pthread_t th2;
        pthread_create(&th1, nullptr, routine_1, nullptr);
        pthread_create(&th2, nullptr, routine_2, nullptr);
        pthread_join(th1, nullptr);
        pthread_join(th2, nullptr);
        return 0;
      }
      
      //运行结果
      //***
      //普通全局变量
      //i am th1, tid:i am th2, tid:139844124174080, cur num: 139844115781376, cur num: 00
      //i am th1, tid:139844124174080, cur num: 1
      //i am th1, tid:139844124174080, cur num: 2
      //i am th1, tid:139844124174080, cur num: 3
      //i am th1, tid:139844124174080, cur num: 4
      //i am th1, tid:139844124174080, cur num: 5
      //i am th1, tid:139844124174080, cur num: 6
      //i am th1, tid:139844124174080, cur num: 7
      //i am th1, tid:139844124174080, cur num: 8
      //i am th1, tid:139844124174080, cur num: 9
      //
      //i am th2, tid:139844115781376, cur num: 11
      //i am th2, tid:139844115781376, cur num: 12
      //i am th2, tid:139844115781376, cur num: 13
      //i am th2, tid:139844115781376, cur num: 14
      //i am th2, tid:139844115781376, cur num: 15
      //i am th2, tid:139844115781376, cur num: 16
      //i am th2, tid:139844115781376, cur num: 17
      //i am th2, tid:139844115781376, cur num: 18
      //i am th2, tid:139844115781376, cur num: 19
      //***
      i am th1, tid:140084059956992, cur num: 0
      i am th1, tid:140084059956992, cur num: 1
      i am th1, tid:140084059956992, cur num: 2
      i am th1, tid:140084059956992, cur num: 3
      i am th1, tid:140084059956992, cur num: 4
      i am th1, tid:140084059956992, cur num: 5
      i am th1, tid:140084059956992, cur num: 6
      i am th1, tid:140084059956992, cur num: 7
      i am th1, tid:140084059956992, cur num: 8
      i am th1, tid:140084059956992, cur num: 9
      i am th2, tid:140084051564288, cur num: 0
      i am th2, tid:140084051564288, cur num: 1
      i am th2, tid:140084051564288, cur num: 2
      i am th2, tid:140084051564288, cur num: 3
      i am th2, tid:140084051564288, cur num: 4
      i am th2, tid:140084051564288, cur num: 5
      i am th2, tid:140084051564288, cur num: 6
      i am th2, tid:140084051564288, cur num: 7
      i am th2, tid:140084051564288, cur num: 8
      i am th2, tid:140084051564288, cur num: 9

      上文说到,线程的线程栈是线程独立的,本质是在线程tcb中另外使用了一块空间用作独立栈。每个执行流的本质是一条调用链,使每个线程都有一个线程栈,可以避免线程的调用链之间相互干扰。需要注意的是,线程的线程栈是在地址空间的共享区被管理的,而进程的堆空间是线程共享的,所以线程的线程栈是独立的,但不是私有的,线程之间没有秘密。

      版权声明:本文内容来自第三方投稿或授权转载,原文地址:https://blog.51cto.com/158SHI/10191605,作者:158SHI,版权归原作者所有。本网站转在其作品的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如因作品内容、版权等问题需要同本网站联系,请发邮件至ctyunbbs@chinatelecom.cn沟通。

      上一篇:关联式数据结构_红黑树剖析 #C++

      下一篇:linux 保存下载 rpm 程序包及其所需依赖

      相关文章

      2025-05-16 09:15:17

      Linux系统基础-多线程超详细讲解(5)_单例模式与线程池

      Linux系统基础-多线程超详细讲解(5)_单例模式与线程池

      2025-05-16 09:15:17
      单例 , 线程 , 队列
      2025-05-16 09:15:10

      Linux系统基础-进程信号超详细讲解

      Linux系统基础-进程信号超详细讲解

      2025-05-16 09:15:10
      kill , 信号 , 命令 , 进程
      2025-05-14 10:07:38

      超级好用的C++实用库之互斥锁

      互斥锁是一种用于多线程编程的同步机制,其主要目的是确保在并发执行环境中,同一时间内只有一个线程能够访问和修改共享资源。

      2025-05-14 10:07:38
      CHP , Lock , 互斥 , 线程 , 释放 , 锁定
      2025-05-14 10:03:13

      超级好用的C++实用库之线程基类

      在C++中,线程是操作系统能够进行运算调度的最小单位。一个进程可以包含多个线程,这些线程共享进程的资源,比如:内存空间和系统资源,但它们有自己的指令指针、堆栈和局部变量等。

      2025-05-14 10:03:13
      Linux , void , Windows , 函数 , 操作系统 , 线程
      2025-05-14 10:02:58

      Linux top 命令使用教程

      Linux top 是一个在Linux和其他类Unix 系统上常用的实时系统监控工具。它提供了一个动态的、交互式的实时视图,显示系统的整体性能信息以及正在运行的进程的相关信息。

      2025-05-14 10:02:58
      CPU , 信息 , 内存 , 占用 , 备注 , 进程
      2025-05-14 10:02:48

      互斥锁解决redis缓存击穿

      在高并发系统中,Redis 缓存是一种常见的性能优化方式。然而,缓存击穿问题也伴随着高并发访问而来。

      2025-05-14 10:02:48
      Redis , 互斥 , 数据库 , 线程 , 缓存 , 请求
      2025-05-14 09:51:15

      java怎么对线程池做监控

      对Java线程池进行监控是确保系统性能和稳定性的重要部分。监控线程池可以帮助我们了解线程池的状态,如当前活跃线程数、任务队列长度、已完成任务数等。

      2025-05-14 09:51:15
      Java , 方法 , 监控 , 示例 , 线程 , 队列
      2025-05-13 09:51:29

      ogg在启动应用进程时报错OGG-00412

      ogg在启动应用进程时报错OGG-00412

      2025-05-13 09:51:29
      ogg , OGG , 时报 , 进程
      2025-05-13 09:51:17

      无法启动ogg配置好的抓取以及投递进程

      无法启动ogg配置好的抓取以及投递进程

      2025-05-13 09:51:17
      ogg , 启动 , 抓取 , 进程
      2025-05-13 09:49:19

      内置变量_其他相关

      内置变量_其他相关

      2025-05-13 09:49:19
      参数 , 基础知识 , 实践 , 小结 , 脚本 , 进程
      查看更多
      推荐标签

      作者介绍

      天翼云小翼
      天翼云用户

      文章

      33561

      阅读量

      5247791

      查看更多

      最新文章

      Linux系统基础-多线程超详细讲解(5)_单例模式与线程池

      2025-05-16 09:15:17

      超级好用的C++实用库之互斥锁

      2025-05-14 10:07:38

      超级好用的C++实用库之线程基类

      2025-05-14 10:03:13

      互斥锁解决redis缓存击穿

      2025-05-14 10:02:48

      java怎么对线程池做监控

      2025-05-14 09:51:15

      如何向线程传递参数

      2025-05-12 08:40:18

      查看更多

      热门文章

      Java线程同步synchronized wait notifyAll

      2023-04-18 14:15:05

      Android Priority Job Queue (Job Manager):线程任务的容错重启机制(二)

      2024-09-25 10:13:46

      操作系统中的线程种类

      2023-04-24 11:27:18

      Android Priority Job Queue (Job Manager):多重不同Job并发执行并在前台获得返回结果(四)

      2023-04-13 09:54:33

      实现远程线程DLL注入

      2023-05-04 08:57:15

      【Java并发编程】之十:使用wait/notify/notifyAll实现线程间通信的几点重要说明

      2023-04-24 11:25:19

      查看更多

      热门标签

      java Java python 编程开发 代码 开发语言 算法 线程 Python html 数组 C++ 元素 javascript c++
      查看更多

      相关产品

      弹性云主机

      随时自助获取、弹性伸缩的云服务器资源

      天翼云电脑(公众版)

      便捷、安全、高效的云电脑服务

      对象存储

      高品质、低成本的云上存储服务

      云硬盘

      为云上计算资源提供持久性块存储

      查看更多

      随机文章

      Python 统计进程池正在执行的进程个数(进程池进程个数)

      Windows 下获得当前线程上下文并保存到dump文件测试之2

      【Java Web】—— 认识 线程与进程

      X64驱动:内核操作进线程/模块

      Java 21 虚拟线程:使用指南(一)

      java并发编程工具类JUC第一篇:BlockingQueue阻塞队列

      • 7*24小时售后
      • 无忧退款
      • 免费备案
      • 专家服务
      售前咨询热线
      400-810-9889转1
      关注天翼云
      • 旗舰店
      • 天翼云APP
      • 天翼云微信公众号
      服务与支持
      • 备案中心
      • 售前咨询
      • 智能客服
      • 自助服务
      • 工单管理
      • 客户公告
      • 涉诈举报
      账户管理
      • 管理中心
      • 订单管理
      • 余额管理
      • 发票管理
      • 充值汇款
      • 续费管理
      快速入口
      • 天翼云旗舰店
      • 文档中心
      • 最新活动
      • 免费试用
      • 信任中心
      • 天翼云学堂
      云网生态
      • 甄选商城
      • 渠道合作
      • 云市场合作
      了解天翼云
      • 关于天翼云
      • 天翼云APP
      • 服务案例
      • 新闻资讯
      • 联系我们
      热门产品
      • 云电脑
      • 弹性云主机
      • 云电脑政企版
      • 天翼云手机
      • 云数据库
      • 对象存储
      • 云硬盘
      • Web应用防火墙
      • 服务器安全卫士
      • CDN加速
      热门推荐
      • 云服务备份
      • 边缘安全加速平台
      • 全站加速
      • 安全加速
      • 云服务器
      • 云主机
      • 智能边缘云
      • 应用编排服务
      • 微服务引擎
      • 共享流量包
      更多推荐
      • web应用防火墙
      • 密钥管理
      • 等保咨询
      • 安全专区
      • 应用运维管理
      • 云日志服务
      • 文档数据库服务
      • 云搜索服务
      • 数据湖探索
      • 数据仓库服务
      友情链接
      • 中国电信集团
      • 189邮箱
      • 天翼企业云盘
      • 天翼云盘
      ©2025 天翼云科技有限公司版权所有 增值电信业务经营许可证A2.B1.B2-20090001
      公司地址:北京市东城区青龙胡同甲1号、3号2幢2层205-32室
      • 用户协议
      • 隐私政策
      • 个人信息保护
      • 法律声明
      备案 京公网安备11010802043424号 京ICP备 2021034386号