第三篇敏捷冲刺博客

江周勉 2023-05-01 23:02:57
这个作业属于哪个课程广工2023软件工程课程
这个作业要求在哪里作业要求
文章内容第三天篇敏捷冲刺

目录

  • 一、任务量与预期任务量
  • 二、近日任务安排
  • 三、实现
  • 1. 为什么需要线程模块
  • 1.1 线程的作用
  • 1.2 线程的定义
  • 1.3 进程和线程的区别
  • 2. 线程模块设计
  • 2.1 概述
  • 2.2核心类的设计
  • 四、感想与期望

一、任务量与预期任务量

模块主要负责人
日志模块钟海超
配置模块李昊旃
线程模块江周勉
协程模块宫旭
协程调度模块赵光明
I/O协程调度模块李伟东
Hook模块邱棋浩(组长)

二、近日任务安排

时间任务
今天线程模块
明天协程模块

三、实现

1. 为什么需要线程模块

1.1 线程的作用

在服务器中,线程模块是非常重要的。服务器需要同时处理多个请求,这些请求可能来自不同的用户或客户端,因此服务器必须能够同时处理多个任务。 而线程是一种轻量级的执行单元,它可以在单个进程内同时执行多个任务。线程可以共享相同的内存空间和资源,这使得它们之间的通信和数据共享更加容易和高效。

1.2 线程的定义

● 一个线程指的是进程中一个单一顺序的控制流,也称为轻量进程(LWP)
● 一个进程可以有很多线程,每个线程并行执行不同的任务
● 线程会拥有自己的堆栈(不共享),但是它与同一进程中的多个线程将共享该进程中的全局变量、文件描述符等系统资源

1.3 进程和线程的区别

● 根本区别:进程是最小的分配资源的单位,线程是最小的执行单位。
● 通信机制:对于不同的进程之间,它们具有独立的数据空间,数据进行传递只能通过通信的方式进行,方式不仅耗时,而且不方便。但同一进程下的线程之间共享数据空间,通信很方便且安全
● 内存分配:系统在运行的时候会为每个进程分配不同的内存空间,而线程除了CPU外,不会再分配空间,而是使用进程的资源空间
● 从属关系:线程是进程的一部分,进程一旦结束,所有线程都结束

2. 线程模块设计

2.1 概述

线程模块,封装了pthread里面的一些常用功能,Thread,Semaphore,Mutex,RWMutex,Spinlock等对象,可以方便开发中对线程日常使用 为什么不适用c++11里面的thread 本框架是使用C++11开发,不使用thread,是因为thread其实也是基于pthread实现的。并且C++11里面没有提供读写互斥量,RWMutex,Spinlock等,在高并发场景,这些对象是经常需要用到的。所以选择了自己封装pthread

sylar的线程模块:
线程模块总体比较简单,需要先了解pthread(Portable Operating System Interface,可移植操作系统接口)

2.2核心类的设计

提供线程类和线程同步类,基于pthread实现,包括以下类:

  • Thread:线程类,构造函数传入线程入口函数和线程名称,线程入口函数类型为void(),如果带参数,则需要用std::bind进行绑定。线程类构造之后线程即开始运行,构造函数在线程真正开始运行之后返回。
  • 线程同步类(这部分被拆分到mutex.h)中:
  • Semaphore: 计数信号量,基于sem_t实现
    Mutex: 互斥锁,基于pthread_mutex_t实现
    RWMutex: 读写锁,基于pthread_rwlock_t实现
    Spinlock: 自旋锁,基于pthread_spinlock_t实现
    CASLock: 原子锁,基于std::atomic_flag实现

img

thread类:

/**
 * @brief 线程类
 */
class Thread : Noncopyable {
public:
    /// 线程智能指针类型
    typedef std::shared_ptr<Thread> ptr;

    /**
     * @brief 构造函数
     * @param[in] cb 线程执行函数
     * @param[in] name 线程名称
     */
    Thread(std::function<void()> cb, const std::string& name);

    /**
     * @brief 析构函数
     */
    ~Thread();

    /**
     * @brief 线程ID
     */
    pid_t getId() const { return m_id;}

    /**
     * @brief 线程名称
     */
    const std::string& getName() const { return m_name;}

    /**
     * @brief 等待线程执行完成
     */
    void join();

    /**
     * @brief 获取当前的线程指针
     */
    static Thread* GetThis();

    /**
     * @brief 获取当前的线程名称
     */
    static const std::string& GetName();

    /**
     * @brief 设置当前线程名称
     * @param[in] name 线程名称
     */
    static void SetName(const std::string& name);
private:

    /**
     * @brief 线程执行函数
     */
    static void* run(void* arg);
private:
    /// 线程id
    pid_t m_id = -1;
    /// 线程结构
    pthread_t m_thread = 0;
    /// 线程执行函数
    std::function<void()> m_cb;
    /// 线程名称
    std::string m_name;
    /// 信号量
    Semaphore m_semaphore;
};

}

四、感想与期望

今天是敏捷冲刺的第三天,内容是实现和测试线程模块。我们的团队一直在交流和协作解决开发中遇到的难题,相信接下来的流程都能顺利完成。

...全文
165 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

192

社区成员

发帖
与我相关
我的任务
社区描述
广工软工21级3、4班,软件工程课程学习、训练、讨论交流社区
软件工程 高校 广东省·广州市
社区管理员
  • ryue.zh
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧