实现逻辑

  • 首先需要一个用于初始化线程池的函数 initPool(pool_t *status,int num)

    • status结构存储:

      1. 一个数组,存储所有子线程的id

      2. 子线程数量

      3. 任务队列(结构)

      4. 条件

      5. 退出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获知文件大小)
  • 还需要俩通用函数:
    1. epollAddFd(int epoll_fd, int fd),把fd加入到epoll_fd对应的epoll中
    2. initSocket(int *socketFd, char *port, char *ip),直接传入字符串形式ip,port就可执行socket操作
  • 异步: 两者之间存在/存活/执行 毫无关联 -> 异步运行

  • 同步: 两者之间有相互影响和联系,对方运行到某一个步骤之后,我才能接着运行

    • 或者我运行到某一个步骤之后,对方才能继续 -> 同步

show me the code

https://gitee.com/shotlink/testaa

更新时间: