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 线程安全吗?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Visual Studio C++ 中的 uWebsockets?
org.apache.xerces.dom.ElementNSImpl.setUserData(Ljava/lang/String;Ljava/lang