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::forward`. This would be optimal in all cases. - you can use `lock_guard` instead of `unique_lock` and either let the lock cover the `notify_one` (cleanest code) or scope it with `{}`s (most optimal code) Lots of problems with the other functions too. I'll come back and comment more later if I get a chance.