C++ 11 mover al devolver un bloqueo
c++11 move-semantics (1)
En el libro "C ++ Concurrencia en Acción" leyendo el siguiente método
std::unique_lock<std::mutex> wait_for_data()
{
std::unique_lock<std::mutex> head_lock(head_mutex);
data_cond.wait(head_lock,[&]{return head.get()!=get_tail();});
return std::move(head_lock);
}
No puedo entender por qué el head_lock es std :: move-ed cuando se devuelve. Mi noción y mi instinto de uso del movimiento y RVO coinciden con la opinión compartida en los valores de C ++ 11 y la confusión de la semántica del movimiento (declaración de retorno)
Pero tiendo a confiar en que el autor sepa mejor. ¿Alguien puede aclarar cuándo std :: move el valor de retorno es mejor y hay algo específico acerca de los bloqueos? Gracias.
Está bien con o sin el std::move
. El nombre de una variable local * se trata como un rvalor en la declaración de return
, lo que hace que el constructor de movimiento se invoque en ambos casos. Los autores supuestamente usaron std::move
por razones estilísticas, para dejar en claro que el bloqueo se está moviendo. Interfiere con NRVO, pero el costo de mover un bloqueo unique_lock
aquí es probablemente mínimo en comparación con el costo del bloqueo y la espera.
En palabras de @Deduplicator, es "una pesimista para enfatizar la semántica real".
Puede probar esto usted mismo: unique_lock
no se puede copiar, así que return head_lock;
No habría compilado si fuera una copia.
* Esta es la regla de C ++ 14. La regla de C ++ 11 está restringida a los casos en los que se permite o se permitiría la copia de la copia, excepto por el hecho de que la variable es un parámetro de función . Esta diferencia es irrelevante en lo que se refiere a esta pregunta, ya que head_lock
obviamente califica para la head_lock
de copias.