次のようなメソッドへのコールバックを取得する 2 つの異なるソース (ネットワーク リッスン) から更新を受信しています。
void onUpdate(Update* update)
{
static MutexT lock;
static hash_set<UpdateID> set;
ScopedGuard _(lock); //lock here
hash_set<UpdateID>::iterator it = set.find(update->id);
if (it == set.end())
set.insert(update->id);
else
return;
listener->onUpdate(/*some stuff*/);
}
両方のソースが同じ更新を提供しているため、重複の通知を避けたい場合は、両方のソース間で調停して、最初に提供した人からの最新情報を入手し、一方のソースが更新されていない可能性がある場合は見逃した更新についても確認する必要があります。信頼できない。onUpdate
問題は、すべての更新をロックするのは費用がかかるということです。重複した呼び出しが絶対に望ましくない場合、このロックを回避する方法はありますか?
(または、少なくともコストを削減する方法ですか?)