信号量解决生产者消费者/读写者问题_右大臣的博客-CSDN博客
一点补充
模拟简单的string,循环队列,vector_右大臣的博客-CSDN博客
补充总结
写一个循环队列
用个循环队列去表示
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就可以去通知对方了