c++ - significado - diccionario de abreviaturas
¿Hay una abreviatura para std:: lock_guard<std:: mutex> lock(m)? (3)
Además de lo que insinuó la respuesta de @ TC, aquí está la forma en C ++ 17:
auto lock = std::lock_guard(someMutex);
Puede leer sobre los cambios en esta propuesta: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0091r3.html
Exactamente lo que dice la pregunta. En C ++, idealmente 11, pero con curiosidad por 14 y más tarde también, hay una sintaxis abreviada para:
std::mutex someMutex;
std::lock_guard<std::mutex> lg(someMutex);
Idealmente, algo que infiere el tipo de exclusión mutua para evitar la refactorización si alguna vez quisiera cambiar a std::recursive_mutex
.
En otras palabras, una forma de hacer esto:
std::mutex someMutex;
std::lock_guard lg(someMutex);
O
auto lg = make_lock_guard(someMutex);
Para todos los poderes de deducción de tipos del C ++ moderno, parece muy redundante escribir std::lock_guard<std::mutex>
cada vez que quiera hacer uno.
Ambas respuestas actuales sugieren el uso de la palabra clave auto para evitar escribir el nombre del tipo. No está mal, pero prefiero que mi código contenga el nombre de tipo y, por lo tanto, utilice la palabra clave auto con mucha moderación. Yo abogaría por el alias del tipo:
using MutexLockGuard = std::lock_guard<std::mutex>;
Para pre-C ++ 17:
template<class Mutex>
std::lock_guard<Mutex> make_lock_guard(Mutex& mutex) {
mutex.lock();
return { mutex, std::adopt_lock };
}
Usar como:
std::mutex someMutex;
auto&& lg = make_lock_guard(someMutex);
Esto aprovecha el hecho de que la inicialización de lista de copias no crea un temporal adicional (incluso conceptualmente). El constructor de un solo parámetro es explicit
y no se puede usar para inicializar-lista-copia, por lo que primero std::adopt_lock
el mutex y luego usamos el constructor std::adopt_lock
.
El valor de retorno se vincula directamente a lg
, lo que extiende su vida útil a la de la referencia, una vez más, no crea temporalmente (incluso conceptualmente) en el proceso.