Блокировка потока с помощью ParameterInstance.lockObject, это работает? - PullRequest
1 голос
/ 04 июля 2011

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

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

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

1 Ответ

1 голос
/ 04 июля 2011

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

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

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

...