使用此websocket ++示例的线程安全用户数据

时间:2013-03-10 06:32:48

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

对于websocket ++的

This示例正是我想要在其核心上做的。

虽然可以使用websocketpp::connection_hdl轻松跟踪用户,但我需要更多地了解这些信息,就像堆栈可能跟踪我们正在查看哪个页面以更新投票,评论,答案,消息一样左上角等。

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

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

1 个答案:

答案 0 :(得分:1)

我实际上是在websocket ++应用程序中执行此操作,但我不使用实验分支。

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

当我想找到UserData时,我只需在地图中查找连接并返回UserData。

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

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