Примитивы синхроинзации

243
03 марта 2019, 21:00

Вопрос теоретический, делал я задачу тестовую для Veeam. Знаменитая задача про архиватор многопоточный. В моей реализации отдельный поток берет порцию данных и сжимает\разжимает ее. И мне прислали ответы на мою задачу. Запускать новый поток для обработки каждого блока менее оптимально, чем переиспользовать существующие потоки. Вопрос, что значит переиспользвоать существующие потоки. Когда они и так в семафоре стоят и жду когда семафор даст им возможность взять новую порцию данных. Не используются примитивы синхроинзации для обработки изменения состояний (реализовано ожидание на sleep’ах, что менее оптимально). Вопрос, что есть примитивы синхронизации для изменения состояний.

Answer 1

По поводу переиспользования потоков уже подсказали в комментах, для этого существует ThreadPool.

По поводу примитивов синхронизации. Windows имеет 4 примитива для синхронизации потоков:

  1. Event. В .NET есть обертка в виде классов AutoResetEvent/ManualResetEvent. Нечто подобное можно сделать при помощи Monitor.Pulse() и Monitor.Wait(). Но объекты Windows более функциональные.
  2. Mutex. С одноименным классом-оберткой. Подобный функционал есть и в самом .NET, в методах класса Monitor или в операторе C# lock.
  3. Semaphore. С одноименным классом-оберткой.
  4. Waitable timer. В NET нет обертки для этого объекта, но зато есть другие таймеры.

Кроме этого потоки можно синхронизировать по другим объектам, например потокам или процессам. Если вы в коде вызываете thread.Join(), вы синхронизируете один поток с окончанием работы другого.

READ ALSO
Yii2 DAC + PostgreSQL JSONB

Yii2 DAC + PostgreSQL JSONB

Исходные данные:

205
Как сделать сложный SQL запрос в yii2

Как сделать сложный SQL запрос в yii2

Пытаюсь выполнить такой запрос в yii2:

256
migrate через файл php (YII)

migrate через файл php (YII)

есть задача реализовать миграции через файл install подскажите можно ли запустить миграции не через консоль а через файл php ?

205