Untitled
unknown
plain_text
7 days ago
2.8 kB
3
Indexable
/****************************************************************************** Welcome to GDB Online. GDB online is an online compiler and debugger tool for C, C++, Python, PHP, Ruby, C#, OCaml, VB, Perl, Swift, Prolog, Javascript, Pascal, COBOL, HTML, CSS, JS Code, Compile, Run and Debug online from anywhere in world. *******************************************************************************/ #include <bits/stdc++.h> using namespace std; class Topic; class Consumer; class Consumer{ public : int consumerId; void consume(string message){ cout<<"Consumer "<<consumerId<<" consumed the message : "<<message<<endl; } }; class Topic{ public : int topicId; vector<Consumer*> consumers; std::mutex consumersMutex; unordered_map<int,queue<message>> queuePerConsumer; Topic(int topicId) : topicId(topicId){} void addMessage(string message){ notifyConsumers(message); } void notifyConsumers(string message){ vector<std::thread> consumerThreads; { std::lock_guard<mutex> consumersLock(consumersMutex); for(auto consumer : consumers){ consumerThreads.emplace_back(&Consumer::consume, consumer, message); } } for(auto &consumerThread:consumerThreads){ consumerThread.join() } } void addConsumer(Consumer* consumer){ std::lock_guard<mutex> consumersLock(consumersMutex); consumers.push_back(consumer); } }; class Pubsub{ public : map<int,Topic*> topics; std::mutex topicsMutex; Topic * createTopic(int topicId){ std::lock_guard<mutex> topicsLock(topicsMutex); Topic * newTopic = new Topic(topicId); topics[newTopic->topicId] = newTopic; return newTopic; } void subscribe(Consumer *consumer, int topicId){ std::lock_guard<mutex> topicsLock(topicsMutex); if(!topics.count(topicId)){ cout<<"Invalid topic with topic id : "<<topicId<<endl; return; } topics[topicId]->addConsumer(consumer); } void publish(string message, int topicId){ std::lock_guard<mutex> topicsLock(topicsMutex); if(!topics.count(topicId)){ cout<<"Invalid topic with topic id : "<<topicId<<endl; return; } topics[topicId]->addMessage(message); } }; int main() { Consumer * c1 = new Consumer(1); Consumer * c2 = new Consumer(2); Consumer * c3 = new Consumer(3); Pubsub pb; pb.createTopic(1); pb.subscribe(c1,1); pb.subscribe(c2,1); pb.publish("I am great",1); pb.subscribe(c3,1); pb.publish("I am lalloo",1); }
Editor is loading...
Leave a Comment