内核优化

This commit is contained in:
2026-08-10 16:17:59 +08:00
parent 3f37c8e6d5
commit c677c65f0e
8 changed files with 136 additions and 2 deletions
@@ -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);
}