Программы на 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]
1729465297
Anonymous
[code]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]