С#, потоки, максимальная нагрузка

Рейтинг: 2Ответов: 1Опубликовано: 12.07.2023

Не очень понимаю механизм работы потоков. Мне казалось, что каждому запущенному потоку выделяется определенное количество памяти и каждый поток работает со своей скоростью, чтобы не мешать главному. То есть какую бы сложную операцию в дополнительном потоке мы не делали, главный поток тормозить не будет. Это не так ? У меня такой код дико вешает фпс. Но как тогда выносить в поток дорогостоящие операции, если из-за них падает фпс ?

float _testSec = 0;
public override void _Process(double delta)
{
    _testSec -= (float)delta;
    if (_testSec < 0 ) 
    {
        _testSec = 1f;

        ThreadStart threadStart = new ThreadStart(ThreadFunction);
        Thread thread = new Thread(threadStart);
        thread.Start();
    }
}

public void ThreadFunction ()
{
    for (int i = 0; i < 1000000000; i++)
    {
        float f = Mathf.Sqrt (i);
    }
}

Ответы

▲ 3Принят

На запуск нового потока тоже тратится куча ресурсов, поэтому потоки лучше использовать из пула.

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

Task task = Task.Run(() => ThreadFunction());

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

А количество одновременно активно работающих потоков не должно превышать количество ядер процессора, у множенное на 2.

int maxCount = Environment.ProcessorCount * 2;

В противном случае будет потребляться много слишком процессорного времени на переключение между потоками.

Для эффективного распределения работы между потоками научитесь пользоваться следующими инструментами:

  1. Комбинаторы - Task.WhenAll, Task.WhenAny, потребуются базовые знания про асинхронное программирование async/await.
  2. Примитивы синхронизации, например SemaphoreSlim.
  3. Шаблон проектирования Producer/Consumer.
  4. Общие понимания о потокобезопасности и работы с потокобезопасными коллекциями.
  5. Навыки разрешения проблем типа "гонка потоков" (race condition) или "дедлок" (deadlock).

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

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

Почитайте: