void test_concurrent_push_and_pop_on_empty_queue() { threadsafe_queue q; std::promise go, push_ready, pop_ready; std::shared_future ready(go.get_future()); std::future push_done; std::future pop_done; try { push_done = std::async(std::launch::async, [&q, ready, &push_ready]() { push_ready.set_value(); ready.wait(); q.push(42); }); pop_done = std::async(std::launch::async, [&q, ready, &pop_ready]() { pop_ready.set_value(); ready.wait(); return q.pop(); }); push_ready.get_future().wait(); pop_ready.get_future().wait(); go.set_value(); push_done.get(); assert(pop_done.get() == 42); assert(q.empty()); } catch (...) { go.set_value(); throw; } }