uWebSockets setUserData 线程安全吗?

Posted

技术标签:

【中文标题】uWebSockets setUserData 线程安全吗?【英文标题】:Is uWebSockets setUserData thread safe? 【发布时间】:2018-09-06 13:09:18 【问题描述】:

我已经按照建议设置了我的服务器。每个线程有一个事件循环。比我每个人都使用 so_reuseport 监听端口。一切似乎都在工作。我没有尝试从另一个线程的连接中执行 setUserData/getUserData。我正在做的是:

struct websocketsession  size_t uid; char * token 

在我的 onconnection 中,我分配 websocketsesion,将其设置为我需要的值,使用 malloc 作为令牌(我在断开连接时免费),而不是在我的 onconnection 中执行以下操作:

struct websocketsession* sess = session_allocate(userid, token); // this should allocate it, and return a pointer from the heap
ws->setUserData((void *) sess)

当我以后需要访问这些数据时,在 onmessage 期间,我会这样做:

struct websocketsesssion* s = (struct websocketsession*) ws->getUserData();
bool can_access = check_for_permission_to_resource (s->uid, s->token, requested_resource);

它似乎正在工作,但我想知道这个实现与 uwebsocket 是否可能存在问题?我更愿意使用我自己的带锁的地图,但推荐的方法是使用 setUserData/getUserData。

我浏览了相关代码,似乎没有同步原语,但是根据我的理解,由于它是每个线程本地的,我认为它应该是线程安全的 - 只是想知道是否有保证,或者有人有经验有吗?

【问题讨论】:

【参考方案1】:

根据我的理解,uWebSockets 基于事件循环,因此每个线程都运行一个事件循环,这意味着(尽管我不确定 uwebsockets 是否保证这一点)用户保持与给定线程的连接,并且所有连续的讨论都是在该线程和最终用户之间完成的。所以这意味着 onConnection 和 onDisconnection 方法对于用户来说总是在同一个线程上。

tldr:setUserData 可能是线程安全的,uWebSockets 不保证这一点,但可以保证到集线器的 onconnection 和 ondisconnection 事件之间的平衡。

【讨论】:

以上是关于uWebSockets setUserData 线程安全吗?的主要内容,如果未能解决你的问题,请参考以下文章

uWebSockets的使用

uWebSockets (C++):安全的 wss 服务器

如何使用 Visual Studio C++ 中的 uWebsockets?

nlohmann/json uWebsocket

org.apache.xerces.dom.ElementNSImpl.setUserData(Ljava/lang/String;Ljava/lang

C++ uWebSockets 在一个线程中集成事件循环