对于生产者消费者/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就可以去通知对方了

相关推荐
Fanxt_Ja2 天前
【LeetCode】算法详解#15 ---环形链表II
数据结构·算法·leetcode·链表
今后1232 天前
【数据结构】二叉树的概念
数据结构·二叉树
散1123 天前
01数据结构-01背包问题
数据结构
消失的旧时光-19433 天前
Kotlinx.serialization 使用讲解
android·数据结构·android jetpack
Gu_shiwww3 天前
数据结构8——双向链表
c语言·数据结构·python·链表·小白初步
苏小瀚3 天前
[数据结构] 排序
数据结构
睡不醒的kun3 天前
leetcode算法刷题的第三十四天
数据结构·c++·算法·leetcode·职场和发展·贪心算法·动态规划
吃着火锅x唱着歌3 天前
LeetCode 978.最长湍流子数组
数据结构·算法·leetcode
Whisper_long3 天前
【数据结构】深入理解堆:概念、应用与实现
数据结构
IAtlantiscsdn3 天前
Redis7底层数据结构解析
前端·数据结构·bootstrap