В каких случаях используются сразу два mutex?
От: Максим Рогожин Россия  
Дата: 10.03.18 12:05
Оценка:
Слабо разбираюсь в многопоточном программировании. Подскажите, пожалуйста, для чего бывает нужно использовать сразу два mutex?
class ProtectedResource {
   std::mutext m_mutex1;
   std::mutext m_mutex1;
   Resource m_resource;
public:
   void accessSharedResource() {
      std::lock_guard<mutex> locker1(m_mutex1);
      std::lock_guard<mutex> locker2(m_mutex2);
      // access m_resource
   }
}

Т.е. бывает что одного mutex не достаточно? В каких случаях?
Отредактировано 10.03.2018 12:06 Максим Рогожин . Предыдущая версия .
Re: В каких случаях используются сразу два mutex?
От: Alexander G Украина  
Дата: 10.03.18 12:11
Оценка: 14 (2) +1
Здравствуйте, Максим Рогожин, Вы писали:

МР>Слабо разбираюсь в многопоточном программировании. Подскажите, пожалуйста, для чего бывает нужно использовать сразу два mutex?


Когда требуется обратиться к одновременно двум защищаемым данным.

Вообще, лучше такого избегать, т.к. разный порядок захвата мьютексов — способ получить deadlock.
Русский военный корабль идёт ко дну!
Re[2]: В каких случаях используются сразу два mutex?
От: Максим Рогожин Россия  
Дата: 10.03.18 12:17
Оценка:
Здравствуйте, Alexander G, Вы писали:

AG>Когда требуется обратиться к одновременно двум защищаемым данным.


Спасибо. Т.е. получается я неправильный пример кода привел? У меня только один ресурс m_resource — в таких случаях два mutex никогда не нужны, так?
Re[2]: В каких случаях используются сразу два mutex?
От: rumit7  
Дата: 10.03.18 12:25
Оценка: 6 (1)
Здравствуйте, Alexander G, Вы писали:

AG>Здравствуйте, Максим Рогожин, Вы писали:


МР>>Слабо разбираюсь в многопоточном программировании. Подскажите, пожалуйста, для чего бывает нужно использовать сразу два mutex?


AG>Когда требуется обратиться к одновременно двум защищаемым данным.


AG>Вообще, лучше такого избегать, т.к. разный порядок захвата мьютексов — способ получить deadlock.


как дополнение — в с++17 во избежание сего чуда введен std::scoped_lock
Re[3]: В каких случаях используются сразу два mutex?
От: Alexander G Украина  
Дата: 10.03.18 12:56
Оценка:
Здравствуйте, Максим Рогожин, Вы писали:

МР>У меня только один ресурс m_resource — в таких случаях два mutex никогда не нужны, так?


Да.
Русский военный корабль идёт ко дну!
Re[3]: В каких случаях используются сразу два mutex?
От: Don Reba Канада https://stackoverflow.com/users/49329/don-reba
Дата: 10.03.18 15:37
Оценка:
Здравствуйте, rumit7, Вы писали:

R>как дополнение — в с++17 во избежание сего чуда введен std::scoped_lock


В С++11 то же самое делается с помощью adopt_lock.

std::lock(e1.m, e2.m);
std::lock_guard<std::mutex> lk1(e1.m, std::adopt_lock);
std::lock_guard<std::mutex> lk2(e2.m, std::adopt_lock);
Ce n'est que pour vous dire ce que je vous dis.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.