diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2021-08-30 11:07:02 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-08-30 11:07:02 +0200 |
commit | 11e7a365a7f6e63b109f24f3f81ff4aaee9bad72 (patch) | |
tree | 0c1fd7dc3f59d1da59d20d0bd56360820634f19f | |
parent | 1a506104aec23f261142bb36fbf8b67eee75122f (diff) | |
parent | b268af77c44525562444494ed91df7e18a4a7a4f (diff) |
Merge pull request #18893 from vespa-engine/balder/lock-on-write-atomic-on-read
As doSeek is called alot more frequent than doUnpack just use locking…
-rw-r--r-- | searchlib/src/vespa/searchlib/queryeval/nearest_neighbor_distance_heap.h | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/searchlib/src/vespa/searchlib/queryeval/nearest_neighbor_distance_heap.h b/searchlib/src/vespa/searchlib/queryeval/nearest_neighbor_distance_heap.h index b7bdffd31c1..821dc67fe64 100644 --- a/searchlib/src/vespa/searchlib/queryeval/nearest_neighbor_distance_heap.h +++ b/searchlib/src/vespa/searchlib/queryeval/nearest_neighbor_distance_heap.h @@ -2,9 +2,10 @@ #pragma once +#include <vespa/vespalib/util/priority_queue.h> #include <mutex> #include <limits> -#include <vespa/vespalib/util/priority_queue.h> +#include <atomic> namespace search::queryeval { @@ -15,7 +16,7 @@ class NearestNeighborDistanceHeap { private: std::mutex _lock; size_t _size; - double _distance_threshold; + std::atomic<double> _distance_threshold; vespalib::PriorityQueue<double, std::greater<double>> _priQ; public: explicit NearestNeighborDistanceHeap(size_t maxSize) @@ -25,14 +26,10 @@ public: _priQ.reserve(maxSize); } void set_distance_threshold(double distance_threshold) { - _distance_threshold = distance_threshold; + _distance_threshold.store(distance_threshold, std::memory_order_relaxed); } double distanceLimit() { - std::lock_guard<std::mutex> guard(_lock); - if (_priQ.size() < _size) { - return _distance_threshold; - } - return _priQ.front(); + return _distance_threshold.load(std::memory_order_relaxed); } void used(double distance) { std::lock_guard<std::mutex> guard(_lock); @@ -42,6 +39,11 @@ public: _priQ.front() = distance; _priQ.adjust(); } + if (_priQ.size() >= _size) { + if (_distance_threshold.load(std::memory_order_relaxed) > _priQ.front()) { + _distance_threshold.store(_priQ.front(), std::memory_order_relaxed); + } + } } }; |