Код: Выделить всё
#include
#include
#include
#include
void spin_lock(volatile void *lock_area, const uint32_t lock_id) {
uint32_t lock = static_cast(lock_area)[0];
spin:
while (lock != 0 && lock != lock_id) {
lock = static_cast(lock_area)[0];
}
static_cast(lock_area)[0] = lock_id;
auto start = std::chrono::high_resolution_clock::now();
while (std::chrono::duration_cast(std::chrono::high_resolution_clock::now() - start).
count() < 10) {
lock = static_cast(lock_area)[0];
}
lock = static_cast(lock_area)[0];
if (lock != lock_id) {
goto spin;
}
}
void spin_unlock(volatile void *lock_area) {
static_cast(lock_area)[0] = 0;
}
uint32_t generate_lock_id(const uint32_t node_id) {
static std::random_device random_device{};
static std::uniform_int_distribution distribution(0, 32768);
const auto process_id = distribution(random_device);
return (static_cast(node_id)
Подробнее здесь: [url]https://stackoverflow.com/questions/79497214/memory-lock-without-atomic-rmw-operations[/url]