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

相关推荐
Coder-magician8 小时前
《代码随想录》刷题打卡day47:并查集-part01
数据结构·算法·图论
垆边人似月.9 小时前
VLAN 资源池(100~200 分档)
数据结构·算法
程序员清风10 小时前
算法与数据结构入门:复杂度、数组与链表
数据结构·算法·链表
Logic10113 小时前
C语言/数据结构排序题解:三个数的最大乘积——排序后比较两种候选情况
c语言·数据结构·数组·排序·时间复杂度·算法题·负数处理
殷色玫瑰15 小时前
C++ string类详解:常用接口、字符串操作与模拟实现
java·linux·c语言·开发语言·数据结构·c++
写后端的胖头鱼16 小时前
时间复杂度 & 空间复杂度
java·数据结构·算法·时间复杂度·空间复杂度
多弗朗皮卡丘16 小时前
数据结构番外:环形队列
数据结构·c
50万马克的面包17 小时前
顺序表和链表_精华知识点_CSDN博客
数据结构·链表
All for pursuit.17 小时前
【回溯-7】494.目标和
数据结构·c++·算法·leetcode
50万马克的面包17 小时前
数据结构01-数据结构概念与复杂度-博客稿
数据结构