我正在编写一些asio / tcp服务器,并希望使用tcp会话标识符映射本机套接字描述符。 我正在写id getter,比如:
inline int get_session_id() { return socket_.native_handle(); }
从第二个(数据包调度线程)调用线程,如:
cout << session_shared_ptr->get_session_id() << endl;
并且它仅在第一次写入有效ID,所以我想我的实现中的某些内容很糟糕。
任何人都可以告诉我错误的地方吗?
答案 0 :(得分:3)
首先,使用原生句柄作为会话ID会让我感到非常糟糕。
您不仅选择了一个实现定义后门,而且还选择了一个不可移植的门户 - 因此您的代码可能会跨平台获得不同的语义。
请记住,这些是抽象的底层句柄。抽象存在是有原因的!谁知道,如果你的网络重新连接,本机句柄可能会改变。没有任何文件说明您可以保留句柄并依赖它来识别API对象。
当然,当你进行多线程处理时,你必须记住线程时你总是做的一切:
现在,您不会谈论同步措施,因此您需要进行数据竞争:
不同的物体:安全。
共享对象: 不安全 。
该标准将数据竞赛指定为Undefined Behaviour;任何事情都可能发生。你可以感谢你的房子没有烧毁。爱好。
总而言之:只使用可靠的ID。生成UUID并将其存储在会话中。如果您知道不能以相等方式移动会话,请使用C ++对象标识(即地址)进行标识。
如果由于某些有用的原因必须从另一个线程访问套接字,请提供同步(互斥 - 互斥,或通过发布到会话链)。