Код: Выделить всё
#include
#include
#include
#include
#include
struct Base
{
virtual ~Base() = default;
};
struct DerivedA : public Base
{
alignas(64) std::atomic counter_a{0};
};
struct DerivedB : public Base
{
alignas(64) std::atomic counter_b{0};
};
void increment_a(DerivedA* da, int iterations)
{
for (int i = 0; i < iterations; ++i)
{
da->counter_a.fetch_add(1, std::memory_order_relaxed);
}
}
void increment_b(DerivedB* db, int iterations)
{
for (int i = 0; i < iterations; ++i)
{
db->counter_b.fetch_add(1, std::memory_order_relaxed);
}
}
int main()
{
std::vector objects;
objects.emplace_back(std::make_unique());
objects.emplace_back(std::make_unique());
auto* derived_a = static_cast(objects[0].get());
auto* derived_b = static_cast(objects[1].get());
int iterations = 10'000'000;
std::thread t1(increment_a, derived_a, iterations);
std::thread t2(increment_b, derived_b, iterations);
t1.join();
t2.join();
std::cout
Подробнее здесь: [url]https://stackoverflow.com/questions/79581901/surprising-cache-line-contention-adjacent-inherited-members[/url]