La différence est que vous pouvez verrouiller et déverrouiller a std::unique_lock. std::lock_guardsera verrouillé une seule fois lors de la construction et déverrouillé lors de la destruction.
Donc, pour le cas d'utilisation B, vous avez certainement besoin d'un std::unique_lockpour la variable de condition. Dans le cas A, cela dépend si vous devez reverrouiller la garde.
std::unique_locka d'autres fonctionnalités qui lui permettent par exemple: d'être construit sans verrouiller le mutex immédiatement mais de construire le wrapper RAII (voir ici ).
std::lock_guardfournit également un wrapper RAII pratique, mais ne peut pas verrouiller plusieurs mutex en toute sécurité. Il peut être utilisé lorsque vous avez besoin d'un wrapper pour une portée limitée, par exemple: une fonction membre:
class MyClass{
    std::mutex my_mutex;
    void member_foo() {
        std::lock_guard<mutex_type> lock(this->my_mutex);            
        /*
         block of code which needs mutual exclusion (e.g. open the same 
         file in multiple threads).
        */
        //mutex is automatically released when lock goes out of scope           
};
Pour clarifier une question par chmike, par défaut std::lock_guardet std::unique_locksont les mêmes. Donc, dans le cas ci-dessus, vous pouvez remplacer std::lock_guardpar std::unique_lock. Cependant, std::unique_lockpourrait avoir un peu plus de frais généraux.
Notez que ces jours-ci, il faut utiliser à la std::scoped_lockplace de std::lock_guard.