Блокировка потока с помощью ParameterInstance.lockObject, это работает?

Я погуглил повсюду и не нашел ответа на это. Я программирую свою собственную маленькую библиотеку Tcp, чтобы мне было проще. На сервере у меня есть объект "ConnectedClient", который имеет сокет и сетевой поток. На статическом классе сервера у меня есть функция Send, которая отправляет поток с префиксом длины. Я хочу, чтобы поток был потокобезопасным, но для каждого клиента. Будет ли это работать для этого?

Send(ConnectedClient client, ...(rest of parameters nor relevant))
{
lock (client.lockObject)
{
// Writing to stream thread-safely I hope...
}
}

Надеюсь, я прояснил себя достаточно, если нет, просто попросите более подробную информацию.

1 ответ

Решение

Похоже, вы пишете какой-то мультиплексор. Действительно, это должно работать нормально, если вы напишите всю полезную нагрузку (и префикс длины) в пределах одного lockи до тех пор, пока lockObject является представителем взаимоисключающего ресурса (т.е. должен быть общим lockObject для всех клиентов, с которыми мы не хотим сталкиваться).

Возможно, более сложный вопрос: собираетесь ли вы читать ответ в этом методе (success/return-value/ критический-fail), или вы собираетесь читать ответ асинхронно, и позволить следующему записывающему оператору записать поток, пока первый сообщение летит...

Для сравнения, при написании BookSleeve (мультиплексор Redis, полный исходный код доступен, если вам нужен некоторый ссылочный код), я выбрал другую стратегию: один выделенный поток, чтобы выполнить всю запись в поток, причем все вызывающие абоненты просто добавляются в поток. безопасная очередь; таким образом, даже если есть отставание в работе, звонящие не задерживаются.

Другие вопросы по тегам