C++ Webserver从零开始:基础知识(八)——多线程编程

本文详细介绍了Linux系统中的线程模型,包括内核线程和用户线程的区别,以及创建、结束线程的方法。重点讨论了线程同步工具如信号量、互斥锁和条件变量,以及多线程环境中的注意事项,如可重入函数、进程间线程关系和信号处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

线程概述

现代Linux系统主要使用的线程库是NPTL,在Linux中可以通过

getconf GNU_LIBPTHREAD_VERSION

获取Linux线程库版本。谈到线程,就不得不提及线程模型

线程模型

本小节概念较多,采用问答式进行讲解,以帮助读者理解

什么是线程?

线程是程序中完成一个独立任务的完整执行序列,即一个可调度的实体。根据运行环境和调度者的身份,线程可分为内核线程和用户线程。

内核线程和用户线程的区别和联系?

内核线程运行在内核空间,由内核来调度。用户线程运行在用户空间,由线程库来调度。

当一个内核线程获得CPU的使用权时,它就会加载并运行一个用户线程,所以从某种角度上来说,内核线程可以看作用户线程运行的“容器”。

线程与进程的关系?

一个进程可以拥有多个线程,假设该进程的线程分为M个内核线程和N个用户线程,那么这些线程符合以下规律:

  • M <= N
  • 在一个系统的所有进程中,MN的比值固定

而且根据MN的比值(M:N),可以划分出三种线程模型,其分别是:

  • 完全在用户空间实现
  • 完全由内核调度

双层调度

三种线程模型?

  • 完全在用户空间实现:完全在用户空间实现的线程无需内核支持,内核也不知道这些用户空间的线程存在。由线程库负责所有线程的优先级,时间片调度。对于内核来说仍把整个进程当作最小单位来调度,不区分里面具体的线程。
    • 优点:创建和调度线程无需内核干预,不占据内核资源,速度快缺点:对于多处理器系统,一个进程的多个线程无法运行在不同的CPU上
  • 完全由内核调度:完全由内核调度的模式将创建,调度的任务全部交给了内核,内核空间的线程库无具体任务。
    • 优缺点:与完全在用户空间实现的优缺点正好相反
  • 双层调度:前两种实现模式的混合体,结合了前两种模式的优点,不会消耗太多的内核资源,切换线程速度较快,可以充分利用多处理器优势


创建线程和结束线程

现在我们来学习线程管理的API,Linux中他们都定义在phtread.h头文件中

pthread_create

#include<pthread.h>
int pthread_create(pthread_t *thread, const pthread_attr_t* attr, void*(*start_routinue)(void*), void* arg);
  • 作用:创建一个线程
  • 参数
    • thread:线程标识符
    • attr:设置新线程的属性
    • start_routine:指定线程运行的函数
    • arg:指定线程运行的函数的参数
  • 返回值
    • 成功:0
    • 失败:错误码

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值