对于生产者消费者/shutdown/close的补充

信号量解决生产者消费者/读写者问题_右大臣的博客-CSDN博客

一点补充

模拟简单的string,循环队列,vector_右大臣的博客-CSDN博客

补充总结

写一个循环队列

cpp 复制代码
用个循环队列去表示

class  myqueue{
vector<int>qq
capacity 容量
front 头
rear  尾巴    
}
  
在push,pop,变化 对于指针去做一个front%capacity或者front%capacity的下标技巧,模拟一个循环队列

用信号量去做生产者消费者,一个判空,一个判满,一个互斥锁

(这个锁也能用信号量 去表示,比如0代表加锁着,1代表锁释放了 -》后面就叫做信号量锁)

流程:先对空/满进行pv操作,在对互斥锁/信号量表示的锁,进行加锁/解锁

如果先操作锁,再操作信号量会引起死锁

用条件变量的话

先操作lock锁,再对cond条件变量进行while wait,再unlock,最后notify

条件变量wait会先释放之前的锁,然后等条件满足了才往下进行,要下进行的时候cond又会自动加上锁,保证互斥,操作完了notify通知

总的来说,cond在操作的时候,集合了三个条件,释放锁-》判断条件是否满足-》加上锁




shutdown和close补充

shutdown可以指定在某个方向上终止连接,通过指定标志:SHUT_RD,

SHUT_WR, SHUT_RDWR。比如指定SHUT_WR后可以继续读数据,但不能写入了。

而close是两个方向上终止连接。

SHUT_RD(0)-》关闭连接的read方向,会把缓冲区有的数据都丢掉,调用read之后都会返回EOF。客户端调用read,消息发过去,对端会给客户端回ack,但是数据并没有读,而是丢了,因此客户端收到仅仅是收到ack,但是并不知道数据有没有被正确读到,其实是丢了

SHUT_WR(1)-》关闭了连接的write方向,会把关时候缓冲区的数据在写出去,然后发个FIN,之后再调write,就会报错

shutdown**关闭读不会给对方发FIN,** 只有关闭写才会发**FIN,** 而且跟local **TCP buffer**状态没关系,只发送FIN包,从不发送RST

SHUT_RDWR (2)相当于上面俩都执行一次,关闭read和write,,但是这样根直接close有啥区别?

  • close关闭连接之后会释放连接所对应的资源和套接字,shutdown不会

  • close存在引用计数的概念,close一次,引用计数-1,当为0的时候,才会终止读写,并不一定会导致该套接字直接不可用了。而shutdown没有这个概念,只要调用就会导致该套接字直接不可用,别的进程也没法用

  • close的引用计数导致,调用完了不一定会发FIN报文,而shutdown是一定会发的,有FIN就可以去通知对方了

相关推荐
星星火柴93610 小时前
关于“双指针法“的总结
数据结构·c++·笔记·学习·算法
艾莉丝努力练剑11 小时前
【洛谷刷题】用C语言和C++做一些入门题,练习洛谷IDE模式:分支机构(一)
c语言·开发语言·数据结构·c++·学习·算法
闪电麦坤9512 小时前
数据结构:迭代方法(Iteration)实现树的遍历
数据结构·二叉树·
Cx330❀12 小时前
【数据结构初阶】--排序(五):计数排序,排序算法复杂度对比和稳定性分析
c语言·数据结构·经验分享·笔记·算法·排序算法
散11213 小时前
01数据结构-Prim算法
数据结构·算法·图论
..过云雨14 小时前
01.【数据结构-C语言】数据结构概念&算法效率(时间复杂度和空间复杂度)
c语言·数据结构·笔记·学习
拂晓银砾14 小时前
Java数据结构-栈
java·数据结构
旺小仔.14 小时前
双指针和codetop复习
数据结构·c++·算法
楽码16 小时前
底层技术SwissTable的实现对比
数据结构·后端·算法
瓦特what?17 小时前
关于C++的#include的超超超详细讲解
java·开发语言·数据结构·c++·算法·信息可视化·数据挖掘