Безопасно ли вызывать функцию в другом потоке? - PullRequest
1 голос
/ 13 марта 2011

Я не знаю много о потоках, но у меня есть функция в главном классе моего консольного приложения под названием SendProcessCmd (string cmd). В моем main () я создаю процесс и сохраняю StreamWriter как член класса var, а мой SendProcessCmd () выдает ему команды .WriteLine ().

У меня есть другой поток с TCP-сервером, который прослушивает соединения, а затем позволяет им отправлять команды процессу с помощью Program.SendProcessCmd (). Насколько это безопасно?

Самый безопасный метод, который я могу придумать, - это найти запущенный процесс в потоке моего сервера, создать новый StreamWriter, а затем выполнить команды. Тем не менее, кажется, что сделать то же самое довольно далеко.

Ответы [ 3 ]

2 голосов
/ 13 марта 2011

Целью потоков является то, что вы всегда можете вызвать любую функцию и получить доступ к любой структуре данных из любого потока.Однако есть ошибки:

  1. Вы всегда должны учитывать проблемы параллелизма, блокировки и предотвращения тупиковых ситуаций и т. Д.
  2. Некоторые функции и структуры данных (особенно связанные с программированием Windows) не могутбыть вызванным / полученным из потока, отличного от основного потока пользовательского интерфейса;это может привести к сбою вашей программы или вызвать исключение
2 голосов
/ 13 марта 2011

Если я вас правильно понял, похоже, что оба потока будут использовать один и тот же StreamWriter.Если это правильно, то вам нужно будет по крайней мере синхронизировать записи в StreamWriter с помощью Monitor .

Если каждый поток использует несколько вызовов метода Write для создания полного сообщения, вам необходимо заблокировать запись других потоков на весь период времени, необходимый для завершения составных частей сообщения, в противном случае компоненты вашего сообщениясмешается, как если бы два человека пытались писать на одном листе бумаги в одно и то же время в одном и том же месте, каждый из которых писал свою историю.

1 голос
/ 13 марта 2011

Выполнение любого кода и доступ к памяти - все это прекрасно для любого количества потоков, выполняемых одновременно. Вы должны следить за тем, чтобы два потока пытались записать в одну и ту же область памяти

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