从另一个线程调用套接字>native_handle()

Calling socket->native_handle() from another thread

本文关键字:native handle gt 线程 另一个 调用 套接字      更新时间:2023-10-16

我正在编写一些asio/tcp服务器,并希望映射本地套接字描述符与tcp会话标识符。我写id getter,比如:

inline int get_session_id() { return socket_.native_handle(); }

从第二个(数据包调度线程)线程调用,如:

cout << session_shared_ptr->get_session_id() << endl;

,它只在第一次写有效id,所以我猜我的实现中有些地方不好。

谁能告诉我哪里错了?

首先,使用本机句柄作为会话id在我看来是一个非常糟糕的主意。

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

记住,这些是抽象的底层句柄。抽象的存在是有原因的!谁知道,如果您的网络重新连接,本机句柄可能会改变。没有文档说明您可以保留句柄并依赖它来标识API对象。


当然,当你做多线程时,你必须记住你在线程化时所做的一切:

  • 同步访问共享状态和资源
  • 协调这些对象的生命周期
  • 在执行上述
  • 时防止饥饿和死锁/软锁

现在,你没有谈论同步度量,所以你有一个数据竞争:

线程安全

不同对象:安全。
不安全.

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


总而言之:使用一个可靠的ID。生成UUID并将其存储在会话中。使用c++对象标识(即地址)进行标识,如果您知道您不使用相等移动会话。

如果你必须从另一个线程访问套接字,提供同步(互斥互斥,或者通过发送到会话链的方式)。