c++ c++11 move-semantics rvo

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.