#include <iostream>
#include <deque>
#include <thread>
#include <mutex>
class BaseThread{
protected:
std::unique_ptr<std::thread> m_t;
public:
virtual void run()=0;
void start()
{
m_t = std::make_unique<std::thread>(&BaseThread::run,this);
}
};
class Productor :public BaseThread{
private:
int m_data=0;
std::shared_ptr<std::deque<int>> m_q;
std::shared_ptr<std::mutex> m_mutex;
bool canGetDeque()
{
std::unique_lock<std::mutex> lock(*m_mutex);
return !m_q->empty();
}
public:
Productor(std::shared_ptr<std::deque<int>> q,std::shared_ptr<std::mutex> mutex):m_q(q),m_mutex(mutex){};
void run() override
{
while(true)
{
{
std::unique_lock<std::mutex> lock(*m_mutex);
m_data++;
m_q->push_back(m_data);
}
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
}
}
};
class Consumer :public BaseThread{
private:
int m_data=0;
std::shared_ptr<std::deque<int>> m_q;
std::shared_ptr<std::mutex> m_mutex;
bool canGetDeque()
{
return !m_q->empty();
}
public:
Consumer(std::shared_ptr<std::deque<int>> q,std::shared_ptr<std::mutex> mutex):m_q(q),m_mutex(mutex){};
void run() override
{
while(true)
{
if(canGetDeque())
{
std::unique_lock<std::mutex> lock(*m_mutex);
m_data=m_q->front();
m_q->pop_front();
std::cout<<"consumer: "<<m_data<<std::endl;
}
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
}
};
class System
{
private:
std::shared_ptr<std::deque<int>> m_q;
std::shared_ptr<std::mutex> m_m;
std::unique_ptr<Productor> m_pro;
std::unique_ptr<Consumer> m_con;
public:
System()
{
m_q = std::make_shared<std::deque<int>>();
m_m = std::make_shared<std::mutex>();
m_pro = std::make_unique<Productor>(m_q,m_m);
m_con = std::make_unique<Consumer>(m_q,m_m);
}
void loop()
{
m_pro->start();
m_con->start();
while(true)
{
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
}
}
};
int main()
{
System s;
s.loop();
return 0;
}
c++的一个多线程示例,模仿继承形式
最新推荐文章于 2024-01-28 09:46:51 发布