Concurrency and parallelism
CP.43
Минимизируйте время, проведенное в критической секции
Причина
Чем меньше времени проводится с захватом mutex, тем меньше шанс, что другой thread должен ждать, и приостановка и возобновление thread дорогостоящие.
Пример
void do_something() // плохо
{
unique_lock<mutex> lck(my_lock);
do0(); // подготовка: не требует блокировки
do1(); // транзакция: требует блокировки
do2(); // очистка: не требует блокировки
}
Здесь мы держим блокировку дольше, чем необходимо: Мы не должны были захватывать блокировку до того, как она нам потребовалась, и должны были освободить её до начала очистки. Мы могли бы переписать это как
void do_something() // плохо
{
do0(); // подготовка: не требует блокировки
my_lock.lock();
do1(); // транзакция: требует блокировки
my_lock.unlock();
do2(); // очистка: не требует блокировки
}
Но это нарушает безопасность и нарушает правило используйте RAII. Вместо этого добавьте блок для критической секции:
void do_something() // OK
{
do0(); // подготовка: не требует блокировки
{
unique_lock<mutex> lck(my_lock);
do1(); // транзакция: требует блокировки
}
do2(); // очистка: не требует блокировки
}
Применение
Невозможно в целом. Отмечайте "голые" lock() и unlock().