jeudi 3 novembre 2016

event queue with std::unique_ptr and std::deque in c++11

Could someone evaluate the source code below. I have just written it to dispatch events properly by using unique_ptr and deque, but I am not sure how accurate it is. I don't have any performance concern.

Thanks in advance.

- Volkan

#include <iostream>
#include <deque>
#include <mutex>
#include <memory>
#include <chrono>
#include <thread>

using namespace std;

class Event {
public:
    Event(int a) : m_a(a)
    { }

    void print()
    {
        cout << m_a << endl;
    }

private:
    int m_a;
};

class EventQueue {
public:
    unique_ptr<Event> pop()
    {
        lock_guard<mutex> lock(m_Mutex);
        unique_ptr<Event> p = nullptr;
        if (!m_Queue.empty()) {
            p = move(m_Queue.back());
            m_Queue.pop_back();
        }

        return p;
    }

    void push(unique_ptr<Event> p)
    {
        lock_guard<mutex> lock(m_Mutex);
        m_Queue.push_front(move(p));
    }

private:
    deque<unique_ptr<Event>> m_Queue;
    mutex m_Mutex;
};

EventQueue evq;

void EventHandler()
{
    while (true) {
        unique_ptr<Event> p = evq.pop();
        if (p)
            p->print();
        else
            this_thread::sleep_for(chrono::seconds(10));
    }
}

int main()
{
    std::thread first (EventHandler);
    while (true) {
        int a;
        cin >> a;
        unique_ptr<Event> ev(new Event(a));
        evq.push(move(ev));
    }

    first.join();
    return 0;
}

Aucun commentaire:

Enregistrer un commentaire