Разница между инициализаторами оператора, принимая замокC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Разница между инициализаторами оператора, принимая замок

Сообщение Anonymous »

мне нужно получить блокировку только во время оценки условия оператора if . else операторы.
Я нашел кусок кода и не знаю, работает ли он. Я довольно новичок в C ++, поэтому, пожалуйста, простите меня, если это очевидный вопрос. Используйте это, если оператор инициализатор:

Код: Выделить всё

if (std::lock_guard lock(mutex); condition) {
// do something
}
Как это будет эквивалентно следующим, которое также будет удерживать блокировку также во время выполнения if или иначе блоки:

Код: Выделить всё

{
std::lock_guard lock(mutex);
if (condition) {
// do something
}
}
< /code>
 Пример 2 < /h3>
Я также нашел что-то вроде этого: < /p>
if (std::lock_guard(mutex); condition) {
// do something
}
Это определенно не работать. Он создаст блокировку, а затем напрямую уничтожит его (и освободит блокировку), поскольку lock_guard не хранится в переменной.
Так что на самом деле этот пример не будет удерживать Оценивается блокировка, когда Code> Code>, а также не удерживает блокировку во время выполнения IF или иначе блоки.
Пример 3
Однако я также нашел этот код: < /p>

Код: Выделить всё

if (std::lock_guard{mutex}, condition) {
// do something
}
Обратите внимание, что вместо a; есть, , а также отличаются скобки, {} вместо () .
Этот код компилируется и запускается. Код> или иначе блокирует, потому что следующее не является мертвой:

Код: Выделить всё

if (std::lock_guard{mutex}, condition) {
std::lock_guard lock(mutex);
// do something
}
< /code>
 Вопросы < /h3>
работает ли код в примере 3, как предполагалось? То есть он содержит блокировку во время оценки условий 
? Я не могу выяснить, действительно ли эта линия работает. Боюсь, это может быть похоже на пример 2.
У этого типа If инициализатор есть имя, чтобы я мог прочитать его?

Подробнее здесь: https://stackoverflow.com/questions/794 ... ing-a-lock
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»