簡體   English   中英

生產者和消費者問題等待線程

[英]Producer and Consumer Problem waiting threads

我嘗試編寫生產者和消費者問題的代碼,但在產生一定值后 -(val) 產生線程結束。 但是消費者線程的條件變量等待通知但是沒有線程通知所以我的程序沒有結束。 我應該做哪些改變?

#include<bits/stdc++.h>
using namespace std;
mutex m;
vector<int>buffer;
condition_variable cv;
void producer(int val){
    while(val){
        std::unique_lock<mutex>lock(m);
        cv.wait(lock, []{ return buffer.size()<50; });
        buffer.push_back(val--);
        cout<<"Produced : "<<buffer.back()<<endl;
        lock.unlock();
        cv.notify_one();
      }
}
void consumer(){
    while(1){
        std::unique_lock<mutex>lock(m);
        cv.wait(lock, []{return buffer.size() > 0 ; });
        cout<<"Consumed : "<<buffer.back()<<endl;
        buffer.pop_back();
        lock.unlock();
        cv.notify_one();
    }
}

int main()
{
    int attempt=1;
     thread t1(producer,30);
    thread t2(consumer);
  
    t1.join();
     t2.join();
 

    return 0;

}

你需要有另一個變量來表明你的生產者將不再生產,這樣你的消費者就會知道

  • 它不再需要等待生產者。
  • 如果它消耗了最新的項目,它應該停止循環。

因此,您的代碼的最小修改可能如下所示:

using namespace std;
mutex m;
vector<int>buffer;
condition_variable cv;
bool producerExhausted = false;
void producer(int val){
    while(val){
        std::unique_lock<mutex>lock(m);
        cv.wait(lock, []{ return buffer.size()<50; });
        buffer.push_back(val--);
        cout<<"Produced : "<<buffer.back()<<endl;
        producerExhausted = val == 0;
        lock.unlock();
        cv.notify_one();
    }
}
void consumer(){
    while(1){
        std::unique_lock<mutex>lock(m);
        if(!producerExhausted)
            cv.wait(lock, []{return buffer.size() > 0 ; });
        cout<<"Consumed : "<<buffer.back()<<endl;
        buffer.pop_back();
        if(producerExhausted && buffer.empty())
            break;
        lock.unlock();
        cv.notify_one();
    }
} 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM