Приспосабливание к 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
Почему мне нужно приобрести блокировку для изменения общей «атомной» переменной, прежде чем уведомлять условия_variable ⇐ C++
Программы на C++. Форум разработчиков
1756498993
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?
Подробнее здесь: [url]https://stackoverflow.com/questions/41867228/why-do-i-need-to-acquire-a-lock-to-modify-a-shared-atomic-variable-before-noti[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия