C++多线程网络编程中,RAII如何防止socket描述符串话?
Owl丶 2020-12-24 11:53:42 《Linux多线程服务端编程:使用muduo网络库》4.7 中描述了socket fd串话的情形:
一个线程从fd=8收到了比较耗时的请求,它开始处理这个请求,并记住要把响应结果发给fd=8。但是在处理过程中,fd=8断开连接,被关闭了,又有新的连接到来,碰巧使用了相同的fd=8。当线程完成响应的计算,把结果发给fd=8时,接收方已经物是人非 。
然后给出的解决办法是使用RAII:
用Socket对象包装文件描述符, 所有对此文件描述符的读写操作都通过此对象进行, 在对象的析构函数里关闭文件描述符。只要Socket还活着,就不会有其他的Socket对象有相同的文件描述符。
我想请问,为啥使用该Socket对象可以防止串话?如果fd=8被动关闭,Socket对象并不会知道,下一个创建的Socket对象不还是用fd=8来初始化吗?