Нужно ли блокировать службы только для чтения при использовании потоков? - PullRequest
1 голос
/ 20 декабря 2008

У меня есть сервис, который я переписываю для использования потоков. Я понимаю, что состояние из одного потока не должно быть доступно другому, но меня немного смущает то, что составляет «состояние». Означает ли это любое поле / свойство / метод вне области действия метода?

В частности, мой сервис выглядит примерно так:

public class MyService
{
      private IRepository<MyClass> repository;
      private ILogger log;
      ...
      public void MyMethod()
      {
        ...
        var t = new Thread(MyMethodAsync);
        t.Start(someState);
      }

      //Is this OK???
      public void MyMethodAsync(object state)
      {
          var someState = (MyState)state;
          log.Log("Starting");
          var someData = repository.GetSomeData(someState.Property);
          //process data
          log.Log("Done");            
      }

      //Or should I be doing this:
      public void MyMethodAsync2(object state)
      {
          var someState = (MyState)state;
          lock(log){
             log.Log("Starting");  }

          lock(repository){         
             var someData = repository.GetSomeData(someState.Property);}

          //process data   
          lock(log){
             log.Log("Done"); }            
      }
}

Ответы [ 3 ]

2 голосов
/ 20 декабря 2008

Э-э ... нет, вам не нужно блокировать ресурсы, доступные только для чтения. Цель их блокировки состоит в том, что если вам нужно проверить значение ресурса перед его записью, то другой ресурс не сможет изменить значение между вашим чтением и записью. i.e.:

SyncLock MyQueue
  If MyQueue.Length = 0 Then
    PauseFlag.Reset
  End If
End SyncLock

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

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

2 голосов
/ 20 декабря 2008

«Состояние» - это все данные, содержащиеся в классе, и реальная проблема, связанная с параллелизмом, заключается в доступе на запись, поэтому ваша интуиция права.

0 голосов
/ 20 декабря 2008

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

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