контролировать количество одновременных действий, разрешенных для динамического запуска c c ++ - PullRequest
0 голосов
/ 22 февраля 2020

нужно найти способ контролировать количество действий, которые могут попасть в критическую секцию. Количество действий может быть обновлено пользователем во время выполнения. Например, если есть 1000 действий, пользователь может выбрать запуск 1 действия за раз, так что это будет последовательным (например, с использованием мьютекса), каждое 1000 действие должно сначала захватить мьютекс. во втором случае допускается одновременное выполнение 500 действий (например, с использованием семафора с начальным значением 500). проблема в том, есть ли способ контролировать это значение N (1 или 500) действий во время выполнения (семафор не поможет, так как не может изменить исходное значение и не знает, сколько действий готово к вводу)

1 Ответ

1 голос
/ 23 февраля 2020

Здесь есть 2 объекта

  • Количество запущенных в данный момент заданий
  • Максимальное количество заданий, разрешенных для запуска

Вы можете сделать обе переменные std::atomic_int, чтобы разрешить изменение из нескольких потоков.

Следующее использование std::condition_variable в сочетании с std::mutex.

Идея псевдокода:

wait on condition variable while num_jobs_running >= num_allowed
++num_jobs_running
release the mutex
do the job
--num_jobs_running
notify condition variable
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...