我已经按照建议设置了我的服务器。每个线程有一个事件循环。然后我让每个人都使用so_reuseport监听端口。一切似乎都很正常。我没有尝试从另一个线程的连接执行setUserData/getUserData。我所做的是:
struct websocketsession { size_t uid; char * token }在我的onconnection中,我分配了websocketsesion,将其设置为我需要的值,使用malloc for token (我在断开连接时释放它),然后我在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的这个实现是否可能有问题?我更喜欢使用我自己的带锁的map,但推荐的方式是使用setUserData/getUserData。
我看了相关的代码,似乎没有syncrhonization原语,但是根据我的理解,它是每个线程的本地原语,我认为它应该是线程安全的-只是想知道是否有保证,或者有人有使用它的经验?
发布于 2018-09-10 19:20:23
根据我的理解,uWebSockets是基于事件循环的,因此每个线程运行一个事件循环,这意味着(尽管我不确定这是否由uwebsocket保证)用户保持与给定线程的连接,并且所有连续的讨论都在该线程和最终用户之间完成。因此,这意味着对于用户来说,onConnection和onDisconnection方法将始终位于同一线程上。
setUserData可能是线程安全的,uWebSockets不能保证这一点,但可以保证到集线器的onconnection和ondisconnection事件之间的平衡。
https://stackoverflow.com/questions/52204896
复制相似问题