Multi-thread safe buffer in C++
Problems with add:


the while(true) is useless
you want to notify_one, not notify_all because you've only added one thing, and so only one thread waiting to remove can remove it.
you should overload for two version which take const T&amp; and T&amp;&amp; (the latter would std::move). This would be optimal in all cases. (analogous to push_back in standard containers)
You may also want to add an emplace to complement the add() versions so you can construct T in-place at the top of the Buffer.
you can use lock_guard instead of unique_lock and scope it with {}s. I'd just say always prefer the lighter weight construct when a heavier weight one isn't strictly needed.


problems with remove:


the while (true) is useless
the cond var lambda can be return !buffer.empty();
the back variable can be std::moved
what happens if you destruct an empty Buffer while a thread is waiting on remove? That case isn't handled at all, and it's a problem
there's no reason to notify_all in remove. Who is it notifying and why?


problems with size:


use a lock_guard unless unique_lock is needed
just do: std::lock_guard&lt;std::mutex&gt; lock{mu}; return buffer.size();