C++ 调用套接字->;来自另一个线程的本机句柄()
我正在编写一些asio/tcp服务器,希望将本机套接字描述符映射为tcp会话标识符。 我在写id getter,比如:C++ 调用套接字->;来自另一个线程的本机句柄(),c++,linux,sockets,posix,boost-asio,C++,Linux,Sockets,Posix,Boost Asio,我正在编写一些asio/tcp服务器,希望将本机套接字描述符映射为tcp会话标识符。 我在写id getter,比如: inline int get_session_id() { return socket_.native_handle(); } 以及从第二个(数据包调度线程)线程调用,如: cout << session_shared_ptr->get_session_id() << endl; cout-get\u session\u id()首先,使用本机
inline int get_session_id() { return socket_.native_handle(); }
以及从第二个(数据包调度线程)线程调用,如:
cout << session_shared_ptr->get_session_id() << endl;
cout-get\u session\u id()首先,使用本机句柄作为会话id给我的印象是一个非常糟糕的主意
您不仅选择了一个实现定义的后门,而且还选择了一个不可移植的后门——因此您的代码有可能在不同的平台上获得不同的语义
记住,这些是抽象的底层句柄。抽象的存在是有原因的!谁知道呢,如果网络重新连接,本机句柄可能会更改。没有任何地方可以记录您可以保留句柄并依靠它来标识API对象
当然,当您执行多线程时,您必须记住在执行线程时经常执行的所有操作:
- 同步对共享状态和资源的访问
- 协调此类对象的生命周期
- 执行上述操作时,应防止饥饿和死锁/软锁
现在,您没有谈到同步措施,因此您有一个数据竞赛:
不同对象:安全。
共享对象:不安全
该标准将数据竞争指定为:;任何事情都有可能发生。你应该庆幸你的房子没有被烧毁。然而
总而言之:只需使用可靠的ID。生成UUID并将其存储在会话中。如果你知道你不移动相等的会话,请使用C++对象标识(即地址)来识别。
如果出于某些有用的原因必须从另一个线程访问套接字,请提供同步(互斥-互斥,或通过发布到会话串的方式)。当您说“第一次”时,我假设您在执行输出语句的时间之间做了一些事情?如果两个输出语句紧挨着一个,它工作得好吗?代码中的第一个和第二个输出之间发生了什么?两个输出之间的连接会发生什么情况?服务器接收到两条消息,将对传递给队列,并将第二个线程用于唤醒和解析消息;消息解析正常,会话ptr也有效,但会话id无效