Как уже упоминали другие, в идеале вы бы избежали этой проблемы с помощью предварительного проектирования и архитектуры программного обеспечения, но я предполагаю, что на данный момент это действительно не вариант.
Как уже упоминалось в другом посте, было бы хорошо обернуть логику в некоторые служебные функции, чтобы в конечном итоге вы не писали нехватку памяти.
Чтобы решить реальную проблему, вы пытаетесь использовать общий ресурс, память, но не можете этого сделать, потому что этот общий ресурс используется другим потоком в системе. В идеале вам нужно подождать, пока один из других потоков в системе освободит нужный вам ресурс, а затем получить этот ресурс. Если бы у вас был способ перехвата всех распределенных и свободных вызовов, вы могли бы что-то настроить так, чтобы распределительный поток блокировался до тех пор, пока не освободилась память, и освобождение сигнализировало выделяющий поток, когда память была доступна. Но я собираюсь предположить, что это просто слишком много работы.
Учитывая ограничения, связанные с невозможностью полностью перестроить систему или переписать распределитель памяти, я думаю, что ваше решение является наиболее практичным, если вы (и другие члены вашей команды) понимаете ограничения и проблемы, которые это вызовет в будущем.
Теперь, чтобы улучшить ваш конкретный подход, вы можете измерить рабочие нагрузки, чтобы увидеть, как часто выделяется и освобождается память. Это поможет вам лучше рассчитать, каким должен быть интервал повторения.
Во-вторых, вы можете попытаться увеличить время ожидания для каждой итерации, чтобы уменьшить нагрузку на этот поток в системе.
Наконец, у вас определенно должно быть время ошибки / паники, если поток не может продвинуться после некоторого количества итераций. Это позволит вам, по крайней мере, увидеть потенциальный случай блокировки в реальном времени, с которым вы можете столкнуться, если все потоки ожидают освобождения памяти другим потоком в системе. Вы можете просто выбрать количество итераций, основываясь на том, что эмпирически показано, как работает, или вы можете стать умнее и отследить, сколько потоков зависло в ожидании памяти, и если это в конечном итоге приводит к панике всех потоков.
Примечание : Очевидно, что это не идеальное решение, и поскольку другие авторы упомянули более глобальный взгляд на приложение в целом, необходимо для правильного решения проблемы, но вышеизложенное является практическим методом. это должно работать в краткосрочной перспективе.