#include<iostream>#include<thread>#include<mutex>#include<condition_variable>#include<queue>classEventManager{public:EventManager(){}voidpublish(int data){std::unique_lock<std::mutex>lock(m_mutex);m_dataQueue.push(data);m_cond.notify_all();}intsubscribe(){std::unique_lock<std::mutex>lock(m_mutex);while(m_dataQueue.empty()){m_cond.wait(lock);}int data = m_dataQueue.front();m_dataQueue.pop();return data;}private:std::mutex m_mutex;std::condition_variable m_cond;std::queue<int> m_dataQueue;};voidthreadFunction1(EventManager& eventManager){for(int i =1; i <=10;++i){eventManager.publish(i);std::cout <<"Thread 1 published data: "<< i << std::endl;}}voidthreadFunction2(EventManager& eventManager){for(int i =1; i <=10;++i){int data = eventManager.subscribe();std::cout <<"Thread 2 subscribed data: "<< data << std::endl;}}intmain(){EventManager eventManager;std::thread thread1(threadFunction1, std::ref(eventManager));std::thread thread2(threadFunction2, std::ref(eventManager));thread1.join();thread2.join();return0;}