从另一个线程

时间:2015-10-15 11:13:58

标签: 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;

并且它仅在第一次写入有效ID,所以我想我的实现中的某些内容很糟糕。

任何人都可以告诉我错误的地方吗?

1 个答案:

答案 0 :(得分:3)

首先,使用原生句柄作为会话ID会让我感到非常糟糕。

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

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

当然,当你进行多线程处理时,你必须记住线程时你总是做的一切:

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

现在,您不会谈论同步措施,因此您需要进行数据竞争:

  

Thread Safety

     

不同的物体:安全。
  共享对象: 不安全

该标准将数据竞赛指定为Undefined Behaviour;任何事情都可能发生。你可以感谢你的房子没有烧毁。爱好。

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

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