Почему мне нужно приобрести блокировку для изменения общей «атомной» переменной, прежде чем уведомлять условия_variable C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Почему мне нужно приобрести блокировку для изменения общей «атомной» переменной, прежде чем уведомлять условия_variable

Сообщение Anonymous »

Приспосабливание к cppreference.com:>>

Поток, который намеревается изменить переменную, должна < /p>


Приобретать std :: mutex (обычно std :: lock_guard) < /li>

выполнять nefute notify_one или notify_all на std :: stordy_variable (блокировку не нужно удерживать для уведомления) < /li>
< /ol>

Даже если общая переменная является атомальной, она должна быть изменена под Mutex, чтобы правильно публиковать модификацию. /> < /blockquote>

Я не совсем понимаю, зачем изменять атомную переменную должна требовать блокировки. См. Следующий фрагмент кода: < /p>

static std::atomic_bool s_run {true};
static std::atomic_bool s_hasEvent {false};
static std::mutex s_mtx;
static std::condition_variabel s_cv;

// Thread A - the consumer thread
function threadA()
{
while (s_run)
{
{
std::unique_lock lock(s_mtx);
s_cv.wait(lock, [this]{
return m_hasEvents.load(std::memory_order_relaxed);
});
}

// process event
event = lockfree_queue.pop();
..... code to process the event ....
}
}

// Thread B - publisher thread
function PushEvent(event)
{
lockfree_queque.push(event)
s_hasEvent.store(true, std::memory_order_release);
s_cv.notify_one();
}
< /code>

В функции pushevent я не получаю s_mtx, потому что S_HASEVENT является атомной переменной, а очередь - беззаботно. В чем проблема без приобретения блокировки s_mtx?

Подробнее здесь: https://stackoverflow.com/questions/418 ... efore-noti
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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