const int NUM = 50;
bool ready = false;
struct DATA
{
int num;
};
struct node {
DATA data[NUM]; // 定义一个大小为10的缓冲区
int tail;
int front;
int count; //记录队列长度
condition_variable is_not_full;
condition_variable is_not_empty;
mutex mu;//互斥量保护缓存
mutex mu2;//保护一个标志位
}NODE;
typedef struct node node;
bool isFull(node *q) { //判断队列是否为满
if ((q->tail+1)%NUM== q->front)
return true;
else
return false;
}
bool isEmpty(node *q) { //判断队列是否为空
if (q->front == q->tail)
return true;
else
return false;
}
int Length(node *q)
{
return (q->tail - q->front + NUM) % NUM;
}
void produce(node *q,int data) {
unique_lock<mutex> locker(q->mu);
while (isFull(q))//不为满就生产
{
cout << "队列已经满了,等待消费信号" << endl;
q->is_not_full.wait(locker);//生产者等待"产品库缓冲区不为满"这一条件发生.
}
q->data[q->tail].num = data;
q->tail = (q->tail + 1) % NUM;
q->is_not_empty.notify_all();//通知消费
locker.unlock();
}
int consumer(node *q)
{
int data;
unique_lock<mutex> locker2(q->mu);
while (isEmpty(q))//不为空就消耗
{
cout << "队列空了,等待生产信号" << endl;
q->is_not_empty.wait(locker2);// 消费者等待"产品库缓冲区不为空"这一条件发生.
}
data = q->data[q->front].num;
q->front = (q->front + 1) % NUM;
q->is_not_full.notify_all();//通知生产
cout << "Consumer thread " << this_thread::get_id() << "消费了:" << data << endl;
locker2.unlock();
return data;
}
void produce_task() {
for (int i = 1; ; i++) //单个生产
{
produce(&NODE, i);
Sleep(1);
}
}
void consumer_task() {
int data;
Sleep(1);
while (1)
{
Sleep(7);//预留足够的时间去缓存数据
data = consumer(&NODE);
}
}
void myque_init(node *q)
{
q->count = 0;
q->front = 0;
q->tail = 0;
for (int i = 0; i < NUM; i++)
q->data[i].num = 0;
}
int main()
{
myque_init(&NODE);
std::thread producer(produce_task); // 创建生产者线程.
std::thread consumer(consumer_task); // 创建消费之线程.
std::thread consumer2(consumer_task); // 创建消费之线程.
std::thread consumer3(consumer_task); // 创建消费之线程.
std::thread consumer4(consumer_task); // 创建消费之线程.
producer.join();
consumer.join();
consumer2.join();
consumer3.join();
consumer4.join();
system("pause");
return 0;
}
c++多线程之单个生产者:多个消费者
猜你喜欢
转载自blog.csdn.net/daixiangzi/article/details/80351154
今日推荐
周排行