- 博客(6)
- 资源 (2)
- 收藏
- 关注
原创 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 2325
原创 条件变量和任务队列
条件变量是一个或多个线程等待某个布尔表达式为真,即等待别的线程“唤醒”它。条件变量的学名叫做管程。条件变量对于wait端:1.必须与mutex一起使用,该布尔表达式的读写需要受到mutex的保护。2.在mutex已上锁的时候才能调用wait()3.把判断布尔条件和wait()放在while循环中。int Queue::getFront(){ Lock l(&(this->mut...
2018-03-05 22:20:40 557 1
原创 线程池封装成类的选择
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 237
原创 非阻塞读写图片出错
问题描述:服务器端采用非阻塞I/O+epoll的模式,客户端发送的图片未能成功接收。 原因:采用EPOLL的边缘触发模式,因此当套接字可读时,只会触发一次,应用层设置的每次读缓冲区为1024,小于内核中的套接字接收缓冲区,因此每次读图片时有大部分数据留在内核缓冲区中未读出。因此,在应用层读套接字时,应该循环读取socket,直到errno==EWOULDBLOCK。 然而,在进行了上述更改之后
2018-01-26 22:20:40 194
原创 线程池出现段错误
经过排查发现相同的连接套接字会被处理多次,在发送完图片后会删除相应图片,因此最终导致段错误。不使用线程池发现请求队列的加锁没有问题,因此问题定位到线程池部分。 最终发现是线程池中加速力度不够,在往线程池中添加任务时,一部分代码没有在锁内,导致出错。 另一个错误是传递给线程池中工作线程的参数是局部变量的指针,当传递给工作线程时他没有能够立即执行,有其他线程抢占,因此该内存地址中的值已经变化了,获
2018-01-26 15:29:42 1147
原创 进程池出现卡死现象
问题描述:客户端发起请求后,服务器端一直处于阻塞状态。 通过ps命令获取到各个进程的进程号 attach 父进程id 查看bt堆栈 attach 子进程id 查看bt堆栈 发现父进程和子进程都阻塞在epoll_wait,子进程复制了父进程的进程空间包括epollfd,因此应该在每个子进程中初始化自己的epollfd
2018-01-26 15:21:29 3126
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人