生產者消費者問題 C 解決方法

2021-08-22 07:18:35 字數 2101 閱讀 7033

抄自維基百科 :

生產者消費者問題(英語:producer-consumer problem),也稱有限緩衝問題(英語:bounded-buffer problem),是乙個多執行緒

同步問題的經典案例。該問題描述了共享固定大小緩衝區的兩個執行緒——即所謂的「生產者」和「消費者」——在實際執行時會發生的問題。生產者的主要作用是生成一定量的資料放到緩衝區中,然後重複此過程。與此同時,消費者也在緩衝區消耗這些資料。該問題的關鍵就是要保證生產者不會在緩衝區滿時加入資料,消費者也不會在緩衝區中空時消耗資料。

要解決該問題,就必須讓生產者在緩衝區滿時休眠(要麼乾脆就放棄資料),等到下次消費者消耗緩衝區中的資料的時候,生產者才能被喚醒,開始往緩衝區新增資料。同樣,也可以讓消費者在緩衝區空時進入休眠,等到生產者往緩衝區新增資料之後,再喚醒消費者。 

本文用乙個itemrepository類表示產品倉庫,其中包含乙個陣列和兩個座標表示的環形佇列、乙個std::mutex成員、用來保證每次只被乙個執行緒讀寫操作 (為了保證列印出來的訊息是一行一行的,在它空閒的時候也借用的這個互斥量╮(╯▽╰)╭)、兩個std::condition_variable表示佇列不滿和不空的狀態,進而保證生產的時候不滿,消耗的時候不空。

#pragma once

#include //std::chrono

#include //std::mutex,std::unique_lock,std::lock_guard

#include //std::thread

#include //std::condition_variable

#include //std::cout,std::endl

#include //std::map

namespace myproducertoconsumer gitemrepo;

void produceitem(itemrepository *ir, int item)

//when unfull

ir->m_itembuffer[ir->m_producepos++] = item;//procude and shift

std::cout << "item no." << item << " produced successfully by "

ir->m_producepos = 0;

ir->m_repounempty.notify_all();//item produced, so it's unempty; notify all consumers

}int consumeitem(itemrepository *ir)

int item = ir->m_itembuffer[ir->m_consumepos++];

std::cout << "item no." << item << " consumed successfully by "

ir->m_consumepos = 0;

ir->m_repounfull.notify_all();//item consumed, so it's unempty; notify all consumers

return item;

}void producerthread()

gitemrepo.m_mtx.lock();

std::cout << "producer thread " << std::this_thread::get_id()

<< " exited." << std::endl;

gitemrepo.m_mtx.unlock();

}void consumerthread()

gitemrepo.m_mtx.lock();

std::cout << "consumer thread " << std::this_thread::get_id()

<< " exited." << std::endl;

gitemrepo.m_mtx.unlock();

}void inititemrepository(itemrepository* ir)

void run()

}

生產者消費者問題

public class producer consumer class godown public godown int num public synchronized void produce int n catch interruptedexception e curr num n syste...

生產者 消費者問題

在學習程序互斥中,有個著名的問題 生產者 消費者問題。這個問題是乙個標準的 著名的同時性程式設計問題的集合 乙個有限緩衝區和兩類執行緒,它們是生產者和消費者,生產者把產品放入緩衝區,相反消費者便是從緩衝區中拿走產品。生產者在緩衝區滿時必須等待,直到緩衝區有空間才繼續生產。消費者在緩衝區空時必 須等待...

生產者 消費者問題

1 程序互斥問題 緩衝區b是臨界資源,程序p和c不能同時對b進行操作,即只能互斥的操作 2 程序同步問題 p不能往 滿 的的緩衝區b放產品,c不能從空的緩衝區獲得產品。當緩衝區滿時,c必須先於p執行,當緩衝區空時,p必須先於c執行 我們給出如下基於記錄型 二元 訊號量機制的解法 10 9 2013 ...