Является ли последовательно согласованное упорядочение памяти строго необходимым в этой блокировке читателей с использовC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Является ли последовательно согласованное упорядочение памяти строго необходимым в этой блокировке читателей с использов

Сообщение Anonymous »

Рассмотрим этот план простого многопоточного приложения. Он имеет одну ветку писателя и десять потоков считывателей. #include
#include

const int Num_readers{10};

std::atomic write_lock;

std::atomic read_lock[Num_readers];

void reader_thread(int reader_number)
{
auto &rl{read_lock[reader_number]};

for (;;)
{
for (;;)
{
rl.store(true, std::memory_order_seq_cst); // #1

if (not write_lock.load(std::memory_order_seq_cst)) // #2
break;

// Avoid writer starvation.
rl.store(false, std::memory_order_seq_cst); // #3

while (write_lock.load(std::memory_order_relaxed)) // #4
std::this_thread::yield();
}

// Read stuff from writer.
}
}

void writer_thread()
{
for (;;)
{
write_lock.store(true, std::memory_order_seq_cst); // #5

bool have_lock;
do
{
have_lock = true;
for (const auto &rl : read_lock)
if (rl.load(std::memory_order_seq_cst)) // #6
{
have_lock = false;
std::this_thread::yield();
break;
}
}
while (not have_lock);

// Write stuff for readers.

write_lock.store(false, std::memory_order_seq_cst); // #7

std::this_thread::yield();
}
}
< /code>
(предположим, что потоки являются статическими.) Целью атомных переменных является взаимное исключение письма и чтения. Можно ли сделать заказ памяти для любой из атомных нагрузок или хранилищ быть менее строгими?

Подробнее здесь: https://stackoverflow.com/questions/797 ... readers-wr
Ответить

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

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

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

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

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