从另一个线程调用套接字>native_handle()
Calling socket->native_handle() from another thread
我正在编写一些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++对象标识(即地址)进行标识,如果您知道您不使用相等移动会话。
如果你必须从另一个线程访问套接字,提供同步(互斥互斥,或者通过发送到会话链的方式)。
相关文章:
- <Windows>为什么 std::thread::native_handle 返回类型为"long long unsigned int"的值,而不是 void*(又名 HANDLE)?
- 为什么导入Mixed native/CLR lib.dll的本机C++应用程序没有在Mixed lib.dll中的外部变
- Android Java USB for native cpp
- React Native (Android):无法通过 JNI 在 jobject 中返回字符串
- protobuf C++ SQLite handle blob data
- OpenCV Native Android cvtColor crash
- CMake Dlibdotnet.native生成错误
- 如何使用Java Native Interface在C++中导入python库-Android Studio
- Android Studio External Native Build 预编译标头
- C++ libtins "An invalid handle was specified"
- 为什么march=native会破坏我的程序?
- React-Native android NDK
- 在 C++/CLI/C# 项目中启用"Native Code Debugging"导致应用程序崩溃
- Android Native libs - 如何对日志进行写入序列化
- java native loadLibrary 无法加载库 - Linux fedora25 java8
- 尝试执行任何需要它的操作时,无法修复 WinAPI 中的"invalid handle"错误
- Android Native:CMake 链接错误:未定义对 GL 函数的引用 - 即使包含并链接了 EGL 和 GLESv3
- Windows HANDLE RAII 管理,如果返回布尔值而不是句柄怎么办?
- 重复Handle()是否执行任何解释性通信(IPC),如果不是为什么目标参数
- React Native 0.40.0:指针和零之间的有序比较("NSNumber *"和"int")