Безопасен ли поток uWebSockets setUserData? - PullRequest
0 голосов
/ 06 сентября 2018

Я настроил свой сервер согласно рекомендации. Иметь один цикл событий на поток. Чем я слушаю каждый порт, используя 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)

Когда мне позже понадобится доступ к этим данным, во время сообщения я делаю:

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 Ответ

0 голосов
/ 10 сентября 2018

Согласно моему пониманию, uWebSockets основан на цикле событий, и поэтому каждый поток запускает один цикл событий, это означает (хотя я не уверен, гарантируется ли это uwebsockets), что пользователь остается подключенным к данному потоку, и все последовательные обсуждения проводятся между этим потоком и конечным пользователем. Таким образом, это означает, что методы onConnection и onDisconnection всегда будут находиться в одном потоке для пользователя.

tldr: setUserData, вероятно, является поточно-ориентированным, uWebSockets не гарантирует этого, но баланс между событиями onconnection и ondisconnection для концентратора гарантирован.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...