0

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

虽然可以很容易地跟踪用户websocketpp::connection_hdl,但我需要保留更多关于他们的信息,就像堆栈可能如何跟踪我们正在查看的页面以更新投票、评论、答案、左上角的消息等。

我刚刚发现在此代码示例中锁定时 .push() 是否失败或等待std::queue不是完全线程安全的?并且我将找到一种方法(可能使用堆栈 q)在为 push 优化的线程安全 C/C++ 队列中工作。更重要的是,我刚刚发现线程安全向量更麻烦Threadsafe Vector class for C++boost::lockfree::queue

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

4

1 回答 1

1

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

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

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

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

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

于 2013-03-10T06:44:00.053 回答