void EventDispatcher::start() { unique_lock<mutex> uk(sMtx); if (started == true) return; started = true; uk.unlock(); for (size_t i = 0; i < THREAD_SIZE; i++) { thread([]() { while (true) { while (true) { unique_lock<mutex> uk(sMtx); if (eventMap.empty() == true) break; auto pair = *eventMap.begin(); eventMap.erase(eventMap.begin()); uk.unlock(); EventDispatcher *obj = pair.first; shared_ptr<Event> &event = pair.second; obj->deliver(event); } unique_lock<mutex> cv_uk(cv_mtx); cv.wait(cv_uk); } }).detach(); } }