项目学习

项目来源

https://github.com/linyacool/WebServer

项目内容

  1. 使用了epoll边沿触发+EPOLLONESHOT+非阻塞IO

  2. 使用了一个固定线程数的线程池

  3. 实现了一个任务队列,由条件变量触发通知新任务的到来

  4. 实现了一个小根堆的定时器及时剔除超时请求,使用了STL的优先队列来管理定时器

  5. 解析了HTTP的get、post请求,支持长短连接

  6. mime设计为单例模式

  7. 线程的工作分配为:

主线程负责等待epoll中的事件,并把到来的事件放进任务队列,在每次循环的结束剔除超时请求和被置为删除的时间结点
工作线程阻塞在条件变量的等待中,新任务到来后,某一工作线程会被唤醒,执行具体的IO操作和计算任务,如果需要继续监听,会添加到epoll中

  1. 锁的使用有两处:

第一处是任务队列的添加和取操作,都需要加锁,并配合条件变量,跨越了多个线程。
第二处是定时器结点的添加和删除,需要加锁,主线程和工作线程都要操作定时器队列。

ip地址和端口复用

https://blog.csdn.net/qq_18973645/article/details/54729035

epoll边沿触发

https://blog.csdn.net/heluan123132/article/details/70196759

EPOLLONESHOT

https://blog.csdn.net/le119126/article/details/46364399
https://blog.csdn.net/liuhengxiao/article/details/46911129
如果是多线程在处理,一个SOCKET事件到来,数据开始解析,这时候这个SOCKET又来了同样一个这样的事件,而你的数据解析尚未完成,那么程序会自动调度另外一个线程或者进程来处理新的事件,这造成一个很严重的问题,不同的线程或者进程在处理同一个SOCKET的事件,这会使程序的健壮性大降低而编程的复杂度大大增加!!即使在ET模式下也有可能出现这种情况!!
EPOLLONESHOT:只监听一次事件,当监听完这次事件之后,如果还需要继续监听这个socket的话,需要再次把这个socket加入到EPOLL队列里

线程池

https://www.cnblogs.com/yangang92/p/5485868.html
互斥锁、条件变量:https://blog.csdn.net/ffilman/article/details/4871920

定时器

http://www.cnblogs.com/zhanghairong/p/3757656.html

epoll

epoll_fd  //所有监听的事件的集合

	//    添加/修改/删除         描述符   事件类型
epoll_ctl ( epoll_fd, EPOLL_CTL_ADD,  fd,  &event ) //添加/修改/删除/事件

       //            活跃事件集合
epoll_wait(epoll_fd,   events,   max_events,   timeout)//返回活跃事件的数目

struct epoll_event 
{    	_u32  events;    //事件类型
	union 
	{    //这是一个联合体,只能存一个数据,但是数据和描述符都是必须的,
	     //所以要将fd放到自定义数据中
	     
		void * ptr;    //自定义数据
		int fd;         //描述符
		_u32 u32;   
	        _u64 u64;    
	} data;
};

线程池

struct threadpool_t
{
    pthread_mutex_t lock;   //互斥锁
    pthread_cond_t notify;  //条件变量
    pthread_t *threads;     //线程数组(线程的ID)
    threadpool_task_t *queue; //任务队列
    int thread_count;       //线程数量
    int queue_size;         //任务队列数量
    int head;               //队头
    int tail;               //队尾
    int count;              //正在等待的任务数量
    int shutdown;
    int started;    
};

//初始化线程池
threadpool_t *threadpool_create(int thread_count, int queue_size, int flags);

//增加一个任务到队列,需要加锁,
int threadpool_add(threadpool_t *pool, void (*function)(void *), void *argument, int flags);

//线程执行,需要加锁,因为要从队列中获取任务
static void *threadpool_thread(void *threadpool);

互斥锁和条件变量:

https://www.cnblogs.com/gvlthu23061/p/7315980.html
与互斥锁不同,条件变量是用来等待而不是用来上锁的。条件变量用来自动阻塞一个线程,直到某特殊情况发生为止。通常条件变量和互斥锁同时使用。条件变量分为两部分:条件和变量。条件本身是由互斥量保护的。线程在改变条件状态前先要锁住互斥量。条件变量使我们可以睡眠等待某种条件出现。条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待“条件变量的条件成立”而挂起;另一个线程使“条件成立”(给出条件成立信号)。条件的检测是在互斥锁的保护下进行的。如果一个条件为假,一个线程自动阻塞,并释放等待状态改变的互斥锁。如果另一个线程改变了条件,它发信号给关联的条件变量,唤醒一个或多个等待它的线程,重新获得互斥锁,重新评价条件。如果两线程共享可读写的内存,条件变量可以被用来实现这两线程间的线程同步。 互斥锁一个明显的缺点是它只有两种状态,锁定和非锁定。而条件变量通过允许线程阻塞和等待另一个线程发送信号的方法弥补了互斥锁的不足,它常和互斥锁一起使用。使用时,条件变量被用来阻塞一个线程,当条件不满足时,线程往往解开相应的互斥锁并等待条件发生变化。一旦其它的某个线程改变了条件变量,它将通知相应的条件变量唤醒一个或多个正被此条件变量阻塞的线程。这些线程将重新锁定互斥锁并重新测试条件是否满足。一般来说,条件变量被用来进行线程间的同步。条件变量只是起阻塞和唤醒线程的作用,具体的判断条件还需用户给出。线程被唤醒后,它将重新检查判断条件是否满足,如果还不满足,一般说来线程应该仍阻塞在这里,被等待被下一次唤醒。这个过程一般用while语句实现。

状态解析:https://blog.csdn.net/u014530704/article/details/78932967
线程池:https://www.cnblogs.com/yangang92/p/5485868.html
url:https://www.cnblogs.com/zhuanzhuruyi/p/6508565.html

进展

准备

配置了sublime、opencv、修改了Makefile,终于是跑起来了

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
对于学习 Spring Boot 的项目学习路线,可以按照以下步骤进行: 1. 第一阶段:了解基础知识和概念。在此阶段,你可以开始学习 Spring Boot 的基础知识和核心概念,包括 Spring Framework、Spring Boot 的特点和优势等。可以参考中提供的学习路线,掌握基础知识和概念是深入学习 Spring Boot 的基础。 2. 第二阶段:学习 Spring Boot Starter。Spring Boot Starter 是 Spring Boot 的一个重要特性,它提供了一种快速集成常用框架和库的方式。在此阶段,你可以学习如何使用已有的 Starter,例如 Spring Data JPA、Thymeleaf 等,来快速集成这些常用框架和库。这将有助于你在实际项目中更快地构建应用程序。可以参考中提供的学习内容,深入理解 Spring Boot Starter 的概念和作用。 3. 第三阶段:深入学习 Spring Boot 特性和功能。在这个阶段,你可以进一步深入学习 Spring Boot 的各种特性和功能,例如自动配置、Actuator、Spring Boot DevTools、Spring Security 等。通过学习和实践,你将能够更好地理解和应用这些功能,进一步提升你的开发能力。可以参考中提供的学习路线,逐步掌握 Spring Boot 的核心概念和功能。 通过以上学习路线,你可以系统地学习和掌握 Spring Boot 的核心概念和功能。随着实践项目的进行和不断学习,你将能够应对更复杂的需求和场景,深入理解和运用 Spring Boot 的各种特性和功能。希望这个学习路线对你的学习有所帮助。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值