Блокировка потока с помощью 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, полный исходный код доступен, если вам нужен некоторый ссылочный код), я выбрал другую стратегию: один выделенный поток, чтобы выполнить всю запись в поток, причем все вызывающие абоненты просто добавляются в поток. безопасная очередь; таким образом, даже если есть отставание в работе, звонящие не задерживаются.