【问题标题】:thread-safe user data with this websocket++ example使用此 websocket++ 示例的线程安全用户数据
【发布时间】:2024-01-23 17:36:01
【问题描述】:

This websocket++ 的例子正是我想要做的核心。

虽然可以使用websocketpp::connection_hdl 轻松跟踪用户,但我需要保留更多关于他们的信息,就像堆栈可能如何跟踪我们正在查看的页面以更新投票、cmets、答案、消息一样左角等。

我刚刚发现 std::queue 不是完全线程安全的 does .push() fail or wait while locked in this code example? 并且我将找到一种方法(可能使用堆栈 q)在 boost::lockfree::queue Thread-Safe C/C++ queue optimized for push 中工作。更重要的是,我刚刚发现线程安全向量更麻烦Threadsafe Vector class for C++

从第一个链接中的代码,我如何在不锁定和阻塞的情况下线程安全地跟踪用户数据(例如当前查看的堆栈问题)?

【问题讨论】:

    标签: c++ thread-safety locking blocking websocket++


    【解决方案1】:

    我实际上是在 websocket++ 应用程序中自己做的,虽然我不使用实验分支。

    我所做的是在 on_open 中创建一个 UserData 对象(我已定义),该对象在构造函数中获取连接。然后我将该对象放在std::map<std::string, connection_hdl> 上。 该字符串是序列化的连接,它提供了一种唯一标识它的方法。 你可以试试std::map<connection_hdl, UserData>

    当我想找到用户数据时,我只需在地图中查找连接,它就会返回用户数据。

    然后,为了使其线程安全,您需要在每次访问 std::map 时执行 boost::unique_lock<boost::mutex>。 几乎没有 std 类可以识别,所以你应该总是添加这样的守卫。

    编辑:Here 是稳定的 websocket++ 中的示例,它显示了如何执行此操作的一种方法。

    【讨论】:

    • 我认为不存在这样的事情 - 您只需在每个访问权限周围添加锁。
    • 我认为mutex类中有try_lock。但是你不会得到很好的自动范围锁定。
    • Here 你有 try_lock 功能。如果您选择使用此方法,您需要手动确保您要么获得锁,要么从函数返回而不访问地图。但它应该同样有效。
    • 顺便说一句,websocket++ 太棒了!我等不及 1.0