gpt4 book ai didi

c++ - 从另一个线程调用 socket->native_handle()

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:50:31 26 4
gpt4 key购买 nike

我正在编写一些 asio/tcp 服务器,并希望将 native 套接字描述符映射到 tcp session 标识符。我写的 id getter 是这样的:

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

然后从第二个(数据包调度线程)线程调用:

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

并且它只在第一次写入有效 ID,所以我猜想我的实现中有什么地方不好。

谁能告诉我哪里做错了?

最佳答案

首先,我认为使用 native 句柄作为 session ID 是一个非常糟糕的主意。

您不仅选择了一个实现定义的后门,而且还选择了一个不可移植的后门 - 因此您的代码有跨平台获得不同语义的风险。

请记住,这些是抽象的底层句柄。抽象存在是有原因的!谁知道,如果您的网络重新连接, native 句柄可能会改变。没有任何文件表明您可以保留句柄并依靠它来识别 API 对象。


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

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

现在,你不谈同步措施,所以你有一场数据竞赛:

Thread Safety

Distinct objects: Safe.
Shared objects: Unsafe.

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


总而言之:只需使用可靠的 ID。生成 UUID 并将其存储在 session 中。如果您知道您不以平等方式移动 session ,请使用 C++ 对象标识(即 地址)进行标识。

如果出于某些有用的原因必须从另一个线程访问套接字,请提供同步(互斥 - 互斥,或通过发布到 session 链的方式)。

关于c++ - 从另一个线程调用 socket->native_handle(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33147037/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com