Mutex на части класса - PullRequest
0 голосов
/ 15 мая 2018

Можно ли использовать мьютексы для частей класса?

Например:

class A{
    int a;
    int b;
    boost::mutex Mutex_for_a;
    boost::mutex Mutex_for_b;
}

, а затем использовать правильный мьютекс для выполнения правильной операции.Я знаю, что это технически возможно, но я не знаю, может ли это привести к проблемам.

Ответы [ 3 ]

0 голосов
/ 15 мая 2018

Да, это возможно.Единственная загвоздка в том, что это будет конкретный объектВы не должны блокировать мьютекст и ждать другого, что может привести к тупиковой ситуации.

0 голосов
/ 15 мая 2018

Можно ли использовать мьютекс для частей класса?

Вы не используете мьютекс на ничего. Мьютекс - это то, что ваши потоки могут «блокировать» и «разблокировать», и он не позволит нескольким потокам заблокировать его одновременно. Это все . Мьютекс не знает , почему ваши потоки блокируют его. Мьютекс не знает и не заботится о том, какие объекты или данные ваш код ассоциирует с ним.

class A{ int a; int b; boost::mutex Mutex_for_a; boost::mutex Mutex_for_b; }

Это может иметь смысл, а может и нет. Невозможно сказать, не увидев, как ваши потоки используют a и b. Основная причина использования мьютекса заключается в том, чтобы другие потоки не могли увидеть некоторую коллекцию данных в несогласованном или недопустимом состоянии, пока какой-то другой поток находится в процессе ее изменения.

Если «коллекция данных», которую вы хотите защитить, содержится в одной переменной int, возможно, имеет смысл поделиться ею, сделав ее std::atomic<int>, и забудьте о мьютексе.

С другой стороны, если есть важные отношения между a и b, то вам следует использовать single mutex для защиты этих отношений.

0 голосов
/ 15 мая 2018

Я знаю, что это технически возможно, но я не знаю, может ли это привести к проблемам.

Это, конечно, возможно. Однако, если с ними не обращаться осторожно, такие вещи могут привести к тупикам:

A::use_a() { std::lock_guard lck{ Mutex_for_a }; use_b(); ... }
A::use_b() { std::lock_guard lck{ Mutex_for_b }; use_a(); ... }

Таким образом, вы должны убедиться, что, если ваш дизайн класса позволяет одновременно блокировать оба мьютекса, порядок блокировки везде одинаков (или лучше использовать std::scoped_lock).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...