Могу ли я записать в определенный индекс списка, если я знаю, что никакой другой поток не получит доступ к этому индексу без блокировки - PullRequest
0 голосов
/ 17 июня 2019

У меня есть 4 потока, каждый из которых имеет свой цикл, и они получают доступ к списку, который содержит дельта-время для каждого потока. Поскольку в этом примере 4 потока, в списке будет 4 элемента. Могут ли эти потоки изменить значение назначенного им индекса (пример: поток 0 - индекс 0 списка) без блокировок, поскольку я знаю, что никакой другой поток не будет писать в этот индекс, или если мне просто нужно использовать блокировки для этого.

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

int threadCount = 4;
bool run = true;
List<double> lastDeltaTime = new List<double>();
private List<Thread> threadList = new List<Thread>();

void InitializeThreads()
{
     for (int i = 0; i < threadCount; i++)
          {
            int tempName = i;
            Thread tempThread = new Thread(() => ThreadLoop(tempName));
            threadList.Add(tempThread);

            lastDeltaTime.Add(0);
          }

     for (int i = 0; i < threadCount; i++)
        {
            threadList[i].Start();
        }
}

void ThreadLoop(int threadName)
{
     double lastTime = DateTime.UtcNow.Ticks;
     while(run)
     {
          double currentTime = DateTime.UtcNow.Ticks;
          double deltaTime = ((currentTime - lastTime) / 10000000) * timescale;
          lastDeltaTime[threadName] = deltaTime; //line setting deltaTime
          //do work

          //end work
          lastTime = currentTime;
     }
}

Ответы [ 2 ]

0 голосов
/ 18 июня 2019

Извлеченная информация:

  • Можно писать в индексное место списка с потоком ТОЛЬКО без блокировки, если вы можете быть уверены, что никакой другой поток также не попытается записать в тот же индекси что список останется того же размера.
  • Используйте массив, если вы можете быть уверены, что никакой другой поток не будет пытаться записать в то же место индекса
  • Использовать класс, который содержит потоки переменную, затем создайте список класса (пока не протестирован мной)
  • В противном случае ... используйте блокировку
0 голосов
/ 18 июня 2019

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

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