std::shared_ptr<T> wait_and_pop() { std::unique_ptr<node> const old_head = wait_pop_head(); return old_head->data; }
void wait_and_pop(T& value) { std::unique_ptr<node> const old_head=wait_pop_head(value); }