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&` and `T&&` (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.