Блокировка памяти без атомных операций 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]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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