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; } }