Мне нужно время от времени обрабатывать объект с задержкой. Однако поток, содержащий объект, не может быть отложен.
Естественное решение — создать отдельный поток, ожидающий такие объекты. Когда объект становится доступным, этот второй поток задерживается по мере необходимости и обрабатывает объект. Второй поток будет спать на семафор. Когда основной поток имеет объект для отложенной обработки, он помещает объект в очередь и сигнализирует семафор.
Хотя это будет работать, есть риск, что другой программист (или я) может забыть сигнализировать семафор при постановке в очередь объекта; Я хочу, чтобы это было навязано.
Итак, я мог бы создать свой собственный контейнер, который основан на стандартном контейнере, но с добавлением обратного вызова (возможно, с использованием дизайна на основе политик) и внутреннего семафора. Это заставит запускать функцию обратного вызова, когда элемент добавляется в контейнер.
Но эта функциональность кажется настолько полезной и столь желанной, что я готов поспорить, что кто-то уже написал это, возможно, с лучшим дизайном, чем я предлагаю здесь, и обратился к волосатым деталям, таким как повторное появление. Существует ли библиотека для этого? Или есть хорошо известная методика получения этой функциональности?
Я использовал частное наследство для этого, наряду с using
декларации:
struct myVec : private std::vector<int> {
// Stuff that works the same
using std::vector<int>::push_back;
using std::vector<int>::erase;
using std::vector<int>::iterator;
// Stuff that works differently:
void erase(std::vector<int>::iterator it) { ... }
};
Важно не использовать публичное наследование от стандартных контейнеров. Вы будут в конечном итоге писать ошибки, связанные с нарезкой и не виртуальные деструкторы.
Других решений пока нет …