![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
后台开发
QianYing94
这个作者很懒,什么都没留下…
展开
-
进程池出现卡死现象
问题描述:客户端发起请求后,服务器端一直处于阻塞状态。通过ps命令获取到各个进程的进程号attach 父进程id查看bt堆栈attach 子进程id查看bt堆栈发现父进程和子进程都阻塞在epoll_wait,子进程复制了父进程的进程空间包括epollfd,因此应该在每个子进程中初始化自己的epollfd原创 2018-01-26 15:21:29 · 3124 阅读 · 0 评论 -
线程池出现段错误
经过排查发现相同的连接套接字会被处理多次,在发送完图片后会删除相应图片,因此最终导致段错误。不使用线程池发现请求队列的加锁没有问题,因此问题定位到线程池部分。最终发现是线程池中加速力度不够,在往线程池中添加任务时,一部分代码没有在锁内,导致出错。另一个错误是传递给线程池中工作线程的参数是局部变量的指针,当传递给工作线程时他没有能够立即执行,有其他线程抢占,因此该内存地址中的值已经变化了,获原创 2018-01-26 15:29:42 · 1145 阅读 · 0 评论 -
非阻塞读写图片出错
问题描述:服务器端采用非阻塞I/O+epoll的模式,客户端发送的图片未能成功接收。原因:采用EPOLL的边缘触发模式,因此当套接字可读时,只会触发一次,应用层设置的每次读缓冲区为1024,小于内核中的套接字接收缓冲区,因此每次读图片时有大部分数据留在内核缓冲区中未读出。因此,在应用层读套接字时,应该循环读取socket,直到errno==EWOULDBLOCK。然而,在进行了上述更改之后原创 2018-01-26 22:20:40 · 178 阅读 · 0 评论 -
线程池封装成类的选择
1.由于线程pthread_create中的回调函数是void*(*fun)(void*)的形式。而封装在类中的线程的运行函数是void *ThreadWorker()的形式,因此声明一个类型别名typedef void*(*Thread)(void *)。在调用pthread_create时,进行强制类型转化,并把类的this指针传递给ThreadWorker函数。if(pthread_crea...原创 2018-01-27 11:02:33 · 218 阅读 · 0 评论 -
条件变量和任务队列
条件变量是一个或多个线程等待某个布尔表达式为真,即等待别的线程“唤醒”它。条件变量的学名叫做管程。条件变量对于wait端:1.必须与mutex一起使用,该布尔表达式的读写需要受到mutex的保护。2.在mutex已上锁的时候才能调用wait()3.把判断布尔条件和wait()放在while循环中。int Queue::getFront(){ Lock l(&(this->mut...原创 2018-03-05 22:20:40 · 552 阅读 · 1 评论 -
EAGAIN不是非阻塞才有
在非阻塞模式下,write或read返回-1,errno为EAGAIN,表示相应的操作还没执行完成。在阻塞模式下,设置SO_RCVTIMEO和SO_SNDTIMEO会导致read/write函数返回EAGAIN。O_NODELAY会导致write接口返回EAGAIN,的确,如果设置了O_NODELAY而当前不可写,那么write接口会设置errno为EAGAIN,但是write接口会返回0而不是-...原创 2018-03-05 23:05:13 · 2318 阅读 · 0 评论