我已按照建议设置服务器。每个线程有一个事件循环。比起我每个人都使用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。
我经历了相关的代码,似乎没有任何同步原语,但是根据我的理解,它是每个线程本地的,所以我认为它应该是线程安全的-只是想知道是否有保证,或者有人有经验用它吗?
答案 0 :(得分:0)
据我了解,uWebSockets基于事件循环,因此每个线程都运行一个事件循环,这意味着(尽管我不确定uwebsockets是否可以保证)用户保持与给定线程的连接,并且所有后续讨论都在该线程和最终用户之间进行。因此,这意味着onConnection和onDisconnection方法对于用户而言将始终位于同一线程上。
tldr:setUserData可能是线程安全的,uWebSockets不能保证这一点,但是可以确保到集线器的onconnection和ondisconnection事件之间达到平衡。