Не зная языка и платформы, довольно сложно посоветовать вам детальную реализацию, однако мой совет несколько похож на совет Лиора Когана.На мой взгляд, однако, вам нужно только два набора, и никакая карта не используется:
Скажем, у вас есть две переменные, представляющие наборы, A и B.
Каждый тактовый импульс удаляет идентификатор агента из набора AКаждые 5 секунд другой поток генерирует предупреждение для каждого идентификатора агента в B, затем устанавливает B = A, и, наконец, что не менее важно, создает набор со всеми идентификаторами агентов и устанавливает A равным этому (если число агентовИдентификаторы действительно велики, вы можете подготовить новый набор между одной проверкой и другой и только спать в течение оставшегося времени).Блокировка потребуется только при изменении переменных, указывающих на каждый набор, при условии, что вы используете коллекцию наборов без блокировки.Производительность будет в значительной степени зависеть от алгоритмической сложности указанной реализации, и если вы пойдете по этому пути, вам следует отдать предпочтение той, которая имеет лучшую производительность (не обязательно лучшую big-O, например, если для вас важна задержка в случае выполнения), для удалений.
В качестве примечания: если память не является проблемой, или сбоев относительно мало, когда вы проверяете, должны ли вы вызывать оповещения и делать это, вы можете сделать это в отдельном потоке и получить интересный интерес.повышение производительности (опять же, платформа и время выполнения имеют значение, поскольку в Erlang это было бы очень просто, но в Windows стоимость создания полноценного нового потока может превысить выигрыш в производительности, если сбоев мало) за счет сохранения старогоB установлен в память.