内核优化
This commit is contained in:
@@ -1,7 +1,10 @@
|
||||
#include <gtest/gtest.h>
|
||||
#include <atomic>
|
||||
#include <chrono>
|
||||
#include <cstdint>
|
||||
#include <memory>
|
||||
#include <thread>
|
||||
#include <vector>
|
||||
#include "renderive/base/observer/Observer.hpp"
|
||||
struct Observer_Test_Observation {
|
||||
int value{};
|
||||
@@ -40,3 +43,41 @@ TEST(disabled_observer_test, accepts_any_observation_structure) {
|
||||
EXPECT_NO_THROW(observer.observe(Observer_Test_Observation{7}));
|
||||
EXPECT_GT(observer.now_ns(), 0);
|
||||
}
|
||||
struct Observer_Test_Concurrent_Time_Source_Data {
|
||||
std::atomic<int> active{};
|
||||
std::atomic<bool> overlap{};
|
||||
std::uint64_t value{};
|
||||
};
|
||||
struct Observer_Test_Concurrent_Time_Source {
|
||||
std::shared_ptr<Observer_Test_Concurrent_Time_Source_Data> data{std::make_shared<Observer_Test_Concurrent_Time_Source_Data>()};
|
||||
std::uint64_t now_ns() const noexcept {
|
||||
if (data->active.fetch_add(1, std::memory_order_acq_rel) != 0) {
|
||||
data->overlap.store(true, std::memory_order_release);
|
||||
}
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(2));
|
||||
const auto value = data->value++;
|
||||
data->active.fetch_sub(1, std::memory_order_acq_rel);
|
||||
return value;
|
||||
}
|
||||
};
|
||||
TEST(observer_state_test, serializes_time_source_access) {
|
||||
Observer_Test_Concurrent_Time_Source time_source;
|
||||
const auto data = time_source.data;
|
||||
Observer_State<Disabled_Observer, Observer_Test_Concurrent_Time_Source> observer(Disabled_Observer{}, std::move(time_source));
|
||||
std::atomic<bool> start{};
|
||||
std::vector<std::thread> threads;
|
||||
for (int index = 0; index < 8; ++index) {
|
||||
threads.emplace_back([&] {
|
||||
while (!start.load(std::memory_order_acquire)) {
|
||||
std::this_thread::yield();
|
||||
}
|
||||
observer.now_ns();
|
||||
});
|
||||
}
|
||||
start.store(true, std::memory_order_release);
|
||||
for (auto& thread : threads) {
|
||||
thread.join();
|
||||
}
|
||||
EXPECT_FALSE(data->overlap.load(std::memory_order_acquire));
|
||||
EXPECT_EQ(data->value, 8);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user