Что потребуется для реализации мьютекса с использованием std::atomic?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Что потребуется для реализации мьютекса с использованием std::atomic?

Сообщение Anonymous »

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

class AtomicLock
{
std::atomic_flag flag;

public:

void lock() {
while (flag.test_and_set(std::memory_order_acquire))
flag.wait(true, std::memory_order_acquire);
}

void unlock() {
flag.clear(std::memory_order_release);
flag.notify_one();
}
};

class ThreadAtomicLock
{
static std::atomic_long id_generator;
std::atomic owner_thread = -1;

static long get_id() {
thread_local auto id = id_generator++;
return id;
}

public:

void lock() {
long expected = -1;
while (!owner_thread.compare_exchange_weak(expected, get_id(), std::memory_order_acquire)) {
owner_thread.wait(expected, std::memory_order_acquire);
expected = -1;
}
}

void unlock() {
long expected = get_id();
assert (
owner_thread.compare_exchange_strong(expected, -1, std::memory_order_release) &&
"unlock of unowned lock"
);
owner_thread.notify_one();
}
};

std::atomic_long ThreadAtomicLock::id_generator = 0;

void testAtomicLock() {
std::vector threads;
std::atomic flag = false;
// AtomicLock lock;
ThreadAtomicLock lock;
for (int i = 0; i < 100; i++) {
threads.emplace_back([&] {
while (!flag.load(std::memory_order_acquire));
lock.lock();
std::cout 

Подробнее здесь: [url]https://stackoverflow.com/questions/79108202/what-would-it-take-to-implement-a-mutex-using-stdatomic[/url]
Ответить

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

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

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

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

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