#include "iostream"
#include "string"
#include "thread" //线程类头文件
#include "mutex" //互斥锁类的头文件
#include "deque" //deque容器的头文件
#include "queue" //queue容器头文件
#include "condition_variable" //条件变量的头文件
using namespace::std;
class AA
{
mutex m_mutex; //互斥锁
condition_variable m_cond;//条件变编
queue<string ,deque<string >>m_q;//缓存队列,底层容器用deque。
public:
void incache(int num)//生存数据,num指定数据的个数。
{
lock_guard<mutex> lock(m_mutex);//申请加锁
for (int ii = 0; ii < num; ++ii) {
static int bh=1; //超女编号。
string message=to_string(bh++)+"号超女";//拼凑出一个数据。
m_q.push(message); //把生产出来的数据入队。
}
m_cond.notify_one();//唤醒一个当前条件变量阻塞的线程。
}
void outcache()
{
while(true)
{
string message;
{
//把互斥锁转换成unique_lock<mutex>,并申请加锁。
unique_lock<mutex> lock(m_mutex);
while (m_q.empty()) //如果队列非空,不进入循环,直接处理数据.必须用循环。
m_cond.wait(lock); //等待生产者的唤醒信号。
//数据元素出队.
message = m_q.front();
m_q.pop();
}
//处理出队的数据(把数据消费掉)。
this_thread::sleep_for(chrono::milliseconds(1));//假设处理数据要一毫秒。
cout<<"线程:"<<this_thread::get_id()<<","<<message<<endl;
}
}
};
int main()
{
AA aa;
thread t1(&AA::outcache,&aa);//创建消费者线程t1.
thread t2(&AA::outcache,&aa);//创建消费者线程t2.
thread t3(&AA::outcache,&aa);//创建消费者线程t3.
this_thread::sleep_for(chrono::seconds(2));//休眠2秒。
aa.incache(3);//生产3个数据.
this_thread::sleep_for(chrono::seconds(3));
aa.incache(5);
t1.join();//回收子线程的资源
t2.join();
t3.join();
}
线程:3,1号超女
线程:3,2号超女
线程:3,3号超女
线程:4,4号超女
线程:4,5号超女
线程:4,6号超女
线程:4,7号超女
线程:4,8号超女
发表回复