2016-04-21 5 views
-1

Я не знаю, как выполняется CLR при запуске программы. Я не совсем понимаю, когда использовать lock() или некоторые другие типы потокобезопасных объектов.Понимание процесса многопоточности и выполнения

Пожалуйста, помогите мне понять следующее:

Имея этот код:

public class Person { 
     string Name {get;set;} 
    } 


public class Calc { 
    public string DoStuff(Person p){ 
     // perform some processing on person object 
     // maybe call external API and update person object 
    } 

} 

Пожалуйста, поправьте меня, если я ошибаюсь, но это мое понимание примера 1. В однотридовой приложение (предположим, что это приложение mvc, и я использую DI и уже зарегистрировал «Сервис» в контейнере.

Я вызываю Service.Work() откуда-то в моем приложении, создается новый Calc() (CLR выделяет этот объект в памяти) и Calc.DoStuff() выполняет вычисление на Person obj ЭСТ. Так как до вызова нового Calc() создается и вызывается из двух браузеров, они находятся в отдельных путях выполнения. Это верно?

// Example 1 
public class Service { 
    public void Work(person) { 
     var calc = new Calc(); 
     string test = calc.DoStuff(person); 
    } 
} 

// Example 2 
public class Service { 
    public Service() { 
     var calc = new Calc(); // this is different 
    } 
    public void Work(person) { 
     string test = calc.DoStuff(person); 
    } 
} 

Теперь то, что происходит в том же сценарии, однако на этот раз в момент выделения службы в памяти Calc конкретизируется в конструкторе Сервиса. Будут ли, что причина проблемы с до одновременных вызовов для работы() (так как существует только один экземпляр Calc? Объект.

  • Что происходит тогда? Имя будет строка заполняться с «последними» строками?).
  • Заблокирован ли он здесь, чтобы сначала он должен был выполнить запрос на первый вызов, а затем второй?
  • Что происходит, когда два браузера называют Work (Person), отправляя два экземпляра Person этому методу. Предположим, что объекты Person «внутри» класса Calc, а затем вызывается внешний API - и кивает бит. Затем второй запрос вызывается Calc (Person), если бы этот объект Person обновлялся независимо (хотя существует только один экземпляр Calc()?). Или первый запрос (тот, который заглох) будет отменен вторым и забыт?
+0

«Итак, если два браузера выполняют Calc.DoStuff() ...» - Вы упомянули браузеры. Это приложение ASP.NET? – mbeckish

+0

Да и нет - поскольку это могут быть браузеры, но может случиться так, что два разных компонента приложения вызовут Service.Work() одновременно. Это имеет значение? если это Asp.net или нет? – BobSwanson

ответ

0

Вот где ваша интуиция заладилось:

Теперь то, что происходит в том же сценарии, однако на этот раз в то время распределения службы в памяти Calc конкретизируется в конструктор Службы. Будет ли, что причиной проблем с одновременными вызовами в работы() (так как существует только один экземпляр Calc? Объекта.

Каждый вызов функции службы имеет свой собственный стек нити, и, таким образом, отдельные копии всех местных переменные.

Для всех намерений и целей, просто представить себе два запроса браузера, как два совершенно отдельных программ.

+0

Я думал, что есть только один поток стека ?. То же самое относится к консольному приложению. Предположим, вы звоните в Службу из двух «областей» консольного приложения одновременно. – BobSwanson

+0

№ Эти два запроса браузера обрабатываются одновременно отдельными потоками на веб-сервере. – mbeckish

+0

В приложении Console по умолчанию будет только один поток, и только один вызов службы произойдет одновременно. Если вы создали два потока, для одновременного вызова службы, у каждого будет свой собственный стек. – mbeckish

0

Вообще говоря, в обоих случаях не следует ожидать, что экземпляр Calc является одинарным (синглтон), так что ваши Метод DoStuff должен иметь некоторую синхронизацию, например lock(p), например, i f экземпляр класса Person одинаково для всех вызовов.

Смежные вопросы