Задать вопрос
@bLercs

Как работают std::mutex?

Задачка:
Поле класса является умным указателем на массив данных, к которому есть доступ из разных потоков других классов. Один в него пишет, другой забирает.

Как вообще применять мьютексы?
Если я создам мьютекс внутри общего класса(убрав copy- и move-конструкторы), где есть функция, внутри которой создаётся тред, то какой тред будет блокировать мьютекс, созданный в поле класса? И какой тред мне нужно блокировать, чтобы избжать одновременного доступа к массиву данных?
Если ещё скажете, что почитать к теме, будет вообще здорово.
  • Вопрос задан
  • 219 просмотров
Подписаться 1 Простой 1 комментарий
Решения вопроса 1
@res2001
Developer, ex-admin
Энтони Уильямс: C++. Практика многопоточного программирования
https://en.cppreference.com/w/cpp/thread

Вы не блокируете тред, вы блокируете мьютекс. Если мьютекс уже заблокирован другим потоком, то второй тред будет ждать пока освободится мьютекс и потом его заблокирует. Ожидание будет происходить непосредственно в методе lock мьютекса. Есть вариант try_lock - когда ожидания не происходит, но если мьютекс уже захвачен кем-то, то возвращается соответствующая ошибка.
В общем случае применение мьютекса выглядит так:
m.lock()
<unsafe operation>
m.unlock()


Конструкторы можно не удалять, просто в них нужно блокировать мьютекс объекта источника. Мьютекс объекта назначения блокировать не нужно, т.к. это конструктор и класс только создается и им пока еще никто не владеет, так что доступ к членам класса будет монопольный. Но в этих конструкторах надо создавать новые мьютексы для объекта назначения.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@bLercs Автор вопроса
Кстати, создастся ли мьюткс таким образом?
std::shared_ptr<std::mutex> m = std::make_shared<std::mutex>( );
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы