#include #include #include #define CACHE_LINE_SIZE 64 // struct alignas(64) data { struct data { char data[2*CACHE_LINE_SIZE]; void store(int value) { int* ip = (int*)(data + CACHE_LINE_SIZE - sizeof(int) / 2); *ip = value; } int load() { int* ip = (int*)(data + CACHE_LINE_SIZE - sizeof(int) / 2); return *ip; } }; __attribute__((aligned(CACHE_LINE_SIZE))) struct data data; std::mutex cout_mutex; void dosth() { for (int i = 0; i < 10000; ++i) { int value = data.load(); int val1 = value & 0xffff; int val2 = (value >> 16) & 0xffff; if (val1 != val2) { std::lock_guard lock(cout_mutex); std::cout << "val1 = " << val1 << ", val2 = " << val2 << std::endl; } value = ((val1 + 1) << 16) | (val1 + 1); data.store(value); } } int main() { std::thread threads[10]; for (int i = 0; i < 10; ++i) { threads[i] = std::thread(dosth); } for (auto& t: threads) t.join(); }