Сможет ли этот многопоточный шаблон помешать начинающему создавать проблемы для себя? - PullRequest
0 голосов
/ 09 октября 2018

Я смотрю на попытку многопоточности моей игры для повышения производительности, но никогда ранее не выполнял многопоточность в столь значительном объеме.Считай меня новичком на эту тему.

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

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

     public class EntityStateChangeBuffer
     {
         object stateLock;

         private int myVar1;
         public int MyVar1 
         {
             set 
             { 
                 lock(stateLock)
                 {
                     myVar1 = value; 
                 }
             }
             internal get
             {
                lock (stateLock)
                {
                    return myVar1;
                }
             }
         }

         private int myVar2;
         public int MyVar2
         {
             set 
             { 
                 lock(stateLock)
                 {
                     myVar2 = value; 
                 }
            }
            internal get
            {
                lock (stateLock)
                {
                    return myVar1;
                }
            }
        }
     }

     public class EntityState
     {
         object stateLock;

         public int MyVar1 { get; private set; }
         public int MyVar2 { get; private set; }

         public void Update(EntityStateChangeBuffer changeBuffer)
         {
             // Apply external changes recieved from other threads
             MyVar1 = changeBuffer.MyVar1;
             MyVar2 = changeBuffer.MyVar2;

             //Do internal state change work
             MyVar1++;
             MyVar2--;

             changeBuffer.MyVar1 = MyVar1;
             changeBuffer.MyVar2 = MyVar2;
         }
     }

Этот код будет сохранен в отдельной сборке для остальной части игры, тогда как внутренние модификаторы на get.

This должен заставить меня всегда вносить изменения безопасным способом, через EntityStateChangeBuffer только для записи, блокировка в котором предотвратит проблемы параллелизма.После того, как эти изменения состояния будут запрошены, они будут действовать в следующий раз, когда объект State вызовет Update ().

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

Есть ли что-то очевидное, что мне не хватает?

...