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

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

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

Как вообще применять мьютексы?
Если я создам мьютекс внутри общего класса(убрав copy- и move-конструкторы), где есть функция, внутри которой создаётся тред, то какой тред будет блокировать мьютекс, созданный в поле класса? И какой тред мне нужно блокировать, чтобы избжать одновременного доступа к массиву данных?
Если ещё скажете, что почитать к теме, будет вообще здорово.
  • Вопрос задан
  • 274 просмотра
Подписаться 1 Простой 1 комментарий
Помогут разобраться в теме Все курсы
  • Яндекс Практикум
    Разработчик C++
    9 месяцев
    Далее
  • Нетология
    Специалист по информационной безопасности + нейросети
    12 месяцев
    Далее
  • Компьютерная академия «TOP»
    Учебная программа “Разработка программного обеспечения”
    30 месяцев
    Далее
  • Нетология
    Разработчик на C++: Профессия + специализация + нейросети
    12 месяцев
    Далее
  • Skillbox
    Разработчик на C++
    7 месяцев
    Далее
  • Специалист.ру
    Программирование на языке C (Си)
    1 месяц
    Далее
  • Специалист.ру
    Программирование на Visual С++
    1 месяц
    Далее
  • XYZ School
    Геймплей-программирование
    5 месяцев
    Далее
Решения вопроса 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>( );
Ответ написан
Ваш ответ на вопрос

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

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