Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 调用套接字->;来自另一个线程的本机句柄()_C++_Linux_Sockets_Posix_Boost Asio - Fatal编程技术网

C++ 调用套接字->;来自另一个线程的本机句柄()

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()首先,使用本机

我正在编写一些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()首先,使用本机句柄作为会话id给我的印象是一个非常糟糕的主意

您不仅选择了一个实现定义的后门,而且还选择了一个不可移植的后门——因此您的代码有可能在不同的平台上获得不同的语义

记住,这些是抽象的底层句柄。抽象的存在是有原因的!谁知道呢,如果网络重新连接,本机句柄可能会更改。没有任何地方可以记录您可以保留句柄并依靠它来标识API对象


当然,当您执行多线程时,您必须记住在执行线程时经常执行的所有操作:

  • 同步对共享状态和资源的访问
  • 协调此类对象的生命周期
  • 执行上述操作时,应防止饥饿和死锁/软锁
现在,您没有谈到同步措施,因此您有一个数据竞赛:

不同对象:安全。
共享对象:不安全

该标准将数据竞争指定为:;任何事情都有可能发生。你应该庆幸你的房子没有被烧毁。然而


总而言之:只需使用可靠的ID。生成UUID并将其存储在会话中。如果你知道你不移动相等的会话,请使用C++对象标识(即地址)来识别。
如果出于某些有用的原因必须从另一个线程访问套接字,请提供同步(互斥-互斥,或通过发布到会话串的方式)。

当您说“第一次”时,我假设您在执行输出语句的时间之间做了一些事情?如果两个输出语句紧挨着一个,它工作得好吗?代码中的第一个和第二个输出之间发生了什么?两个输出之间的连接会发生什么情况?服务器接收到两条消息,将对传递给队列,并将第二个线程用于唤醒和解析消息;消息解析正常,会话ptr也有效,但会话id无效