Блокировка памяти без атомных операций RMWC++

Программы на C++. Форум разработчиков
Anonymous
Блокировка памяти без атомных операций RMW

Сообщение Anonymous »

Я работаю с картой отражающей отражающей памяти с оптоволоконной оптической (моделью RFM2G), которой не хватает атомных операций с чтением-модификацией. Моя цель состоит в том, чтобы реализовать Spinlock для нескольких процессов (потенциально работающих на разных компьютерах), используя только общую память и прерывания, предоставленные этой картой. Операции памяти. Логика (упрощенная) выглядит следующим образом: < /p>

Код: Выделить всё

#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]

Вернуться в «C++»