192
社区成员




这个作业属于哪个课程 | 广工2023软件工程课程 |
---|---|
这个作业要求在哪里 | 作业要求 |
文章内容 | 第三天篇敏捷冲刺 |
模块 | 主要负责人 |
---|---|
日志模块 | 钟海超 |
配置模块 | 李昊旃 |
线程模块 | 江周勉 |
协程模块 | 宫旭 |
协程调度模块 | 赵光明 |
I/O协程调度模块 | 李伟东 |
Hook模块 | 邱棋浩(组长) |
时间 | 任务 |
---|---|
今天 | 线程模块 |
明天 | 协程模块 |
在服务器中,线程模块是非常重要的。服务器需要同时处理多个请求,这些请求可能来自不同的用户或客户端,因此服务器必须能够同时处理多个任务。 而线程是一种轻量级的执行单元,它可以在单个进程内同时执行多个任务。线程可以共享相同的内存空间和资源,这使得它们之间的通信和数据共享更加容易和高效。
● 一个线程指的是进程中一个单一顺序的控制流,也称为轻量进程(LWP)
● 一个进程可以有很多线程,每个线程并行执行不同的任务
● 线程会拥有自己的堆栈(不共享),但是它与同一进程中的多个线程将共享该进程中的全局变量、文件描述符等系统资源
● 根本区别:进程是最小的分配资源的单位,线程是最小的执行单位。
● 通信机制:对于不同的进程之间,它们具有独立的数据空间,数据进行传递只能通过通信的方式进行,方式不仅耗时,而且不方便。但同一进程下的线程之间共享数据空间,通信很方便且安全
● 内存分配:系统在运行的时候会为每个进程分配不同的内存空间,而线程除了CPU外,不会再分配空间,而是使用进程的资源空间
● 从属关系:线程是进程的一部分,进程一旦结束,所有线程都结束
线程模块,封装了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,可移植操作系统接口)
提供线程类和线程同步类,基于pthread实现,包括以下类:
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;
};
}
今天是敏捷冲刺的第三天,内容是实现和测试线程模块。我们的团队一直在交流和协作解决开发中遇到的难题,相信接下来的流程都能顺利完成。