实现逻辑
首先需要一个用于初始化线程池的函数 initPool(pool_t *status,int num)
status结构存储:
一个数组,存储所有子线程的id
子线程数量
任务队列(结构)
锁
条件
退出flag
quene结构即一个队列,包含头结点,尾节点,列长度。结点则由用于通信的fd,指向下一个结点的next指针组成。
关于队列则还需要入队出队两个函数。
- 同时需要告知线程们要做啥工作,通过定义一个函数(线程入口函数),以指针的形式传给pthread_create,其实就是worker.c存在的意义。、
- 入口函数的锁逻辑:开始时先上锁,while循环判断若队列无任务则加上一个条件锁,等待被唤醒才继续,随后定义一个netFd,化身为队头元素,然后deQuene,便可解锁。最终开始传输。
- main.c的锁逻辑:当有新连接到来时,accept为netFd,上锁。紧接着进队,而后唤醒入口函数的条件锁并解锁。
- 实则除了关于退出flag的锁,锁都是关于保护队列操作的
- 传输函数:传入一个通信用fd。
- 传输部分实际上只需要传
- 文件名大小与文件名,然后只剩下内容,直接sendfile(int __out_fd, int __in_fd, off_t *__offset, size_t __count)。参数依次是目标fd,前面open的文件fd,偏移位,文件大小(用stat定义一个结构,作为fstat(int __fd, struct stat *__buf)的buf来接受文件信息,便可以用stat.st_size获知文件大小)
- 还需要俩通用函数:
- epollAddFd(int epoll_fd, int fd),把fd加入到epoll_fd对应的epoll中
- initSocket(int *socketFd, char *port, char *ip),直接传入字符串形式ip,port就可执行socket操作
-
异步: 两者之间存在/存活/执行 毫无关联 -> 异步运行
-
同步: 两者之间有相互影响和联系,对方运行到某一个步骤之后,我才能接着运行
- 或者我运行到某一个步骤之后,对方才能继续 -> 同步
show me the code
https://gitee.com/shotlink/testaa