loop()がこれではいかんのはわかってるけど、どうすれば簡潔に書けるのかわからん
他にもあやしいところがある気がする

bool running = true;
std::deque<int> unsafe_queue;
std::mutex mtx;
std::condition_variable cond;
using unique_lock = std::unique_lock<std::mutex>;
void stop() { running = false; }
void add_event(int i)
{
  unique_lock _(mtx);
  unsafe_queue.push_back(i);
  cond.notify_one();
}
void dispatch(int) { /*do something*/ }
void loop()
{
  unique_lock lock(mtx);
  while (running) {
    cond.wait(lock, [] { return !unsafe_queue.empty(); });
    auto ev = unsafe_queue.front();
    unsafe_queue.pop_front();
    dispatch(ev);
  }
}