第三篇敏捷冲刺博客
| 这个作业属于哪个课程 | 广工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实现

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;
};
}
四、感想与期望
今天是敏捷冲刺的第三天,内容是实现和测试线程模块。我们的团队一直在交流和协作解决开发中遇到的难题,相信接下来的流程都能顺利完成。
相关推荐
敏捷项目冲刺待办列表
该资源为敏捷项目管理冲刺待办列表,包括燃尽图、任务管理计划等标准模板
EtaMitse:敏捷冲刺计划会议的估算应用程序
敏捷的核心价值观包括个体和互动高于流程和工具,可工作的软件高于详尽的文档,客户合作高于合同谈判,以及响应变化高于遵循计划。**敏捷冲刺**敏捷冲刺是敏捷开发中的一个关键概念,通常持续1-4周。
敏捷PPT
- **冲刺(Sprint)**:固定时间周期(通常为两周或一个月),团队在一个冲刺内完成一组任务。
Scrum精髓_敏捷转型指南高清完整版.zip
这份"Scrum精髓_敏捷转型指南高清完整版.pdf"很可能涵盖了这些内容,包括如何设置和运行冲刺,如何有效地进行团队协作,以及如何利用Scrum进行敏捷转型。
07. 敏捷估计与规划.pdf
敏捷规划则关注如何将工作分解为可管理的短期迭代,通常称为冲刺(Sprint)或迭代。在每个冲刺开始时,团队会共同选择一组可以在冲刺内完成的工作,形成冲刺待办事项列表(Sprint Backlog)。



